function dateFromJson(jsonData){
	if(!jsonData) return null;
	return new Date(jsonData.time);
}

function formatDateFromJson(jsonData){
	return formatDate(dateFromJson(jsonData));
}
function formatDateTimeFromJson(jsonData){
	return formatDateTime(dateFromJson(jsonData));
}
function formatTimeFromJson(jsonData){
	return formatTime(dateFromJson(jsonData));
}

function formatDate(date){
	if(!date) return null;
	var f = DATE_FORMAT || "YYYY-MM-DD";
	return moment(Date(date)).format(f);
}

function formatTime(date){
	if(!date) return null;
	var f = HOUR_FORMAT || "HH:mm";
	return moment(Date(date)).format(f);
}

function formatDateTime(date){
	if(!date) return null;
	var f = DATE_FORMAT + " " + HOUR_FORMAT || "YYYY-MM-DD HH:mm";
	return moment(Date(date)).format(f);
}

function formatStreet(street, house, flat){
	return street + " " + house + ( (flat) ? "/" + flat : "");
}

function objectSize(obj){
	var count = 0;
	for (var i in obj) {
		if (obj.hasOwnProperty(i)) {
			count++;
		}
	}
	return count;
}

function valueFromMap(key, map){
	if(key){
		return map[key];
	}else{
		return map["nullEntry"];
	}
}

function tmplData(data){
	return {
		o:data,
		formatDateFromJson: formatDateFromJson,
		formatTimeFromJson: formatTimeFromJson,
		formatDateTimeFromJson: formatDateTimeFromJson,
		formatDate: formatDate,
		formatTime: formatTime,
		formatDateTime: formatDateTime,
		formatStreet: formatStreet,
		objectSize: objectSize,
		valueFromMap: valueFromMap
	};
}

window.console || (console = { log: function(){} });

var ErrorUtils = {
	//TODO: check if response success and fire event with message
	checkAjax: function(data){
		switch(data.statusCode){
			case -10:
				if(confirm(data.error+"\n"+"Czy chcesz przejść do strony logowania?")){
					window.location = Url.start;
				}
			break;
	//		case undefined:
			case -1:
				var msg = "Wystąpił problem";
				switch(DEBUG){
					case 0:
						break;
					case 1:
						msg +=": "+data.error;
						break;
					case 2:
						msg +=": "+data.error;
						console.log(data.errorDetails);
						break;
				}
				alert(msg);
				return false;
				//break;
		default:
			return true;
		}
	}
};
Handlebars.registerHelper("debug", function(optionalValue) {
  console.log("Current Context");
  console.log("====================");
  console.log(this);
 
  if (optionalValue) {
    console.log("Value");
    console.log("====================");
    console.log(optionalValue);
  }
});

//depends on: Handlebars, moment
Handlebars.registerHelper('ifstring', function(item, options) {
  if((typeof item) == "string" || item instanceof String) {
    return options.fn(this);
  } else {
    return options.inverse(this);
  }
});

Handlebars.registerHelper('ifstrlongthan', function(item, len, options) {
  if(item.length > len) {
    return options.fn(this);
  } else {
    return options.inverse(this);
  }
});
Handlebars.registerHelper('ifboolean', function(item, options) {
  if((typeof item) == "boolean" || item instanceof Boolean) {
    return options.fn(this);
  } else {
    return options.inverse(this);
  }
});
//from http://assemble.io/helpers/helpers-comparison.html
Handlebars.registerHelper('is',function (value, test, options) {
	if (value === test) {
		return options.fn(this);
	} else {
		return options.inverse(this);
	}
});
Handlebars.registerHelper('fromTextArea', function(text) {
  var multiLineText = Handlebars.Utils.escapeExpression(text).split("\n").join("<br>");
  return new Handlebars.SafeString(multiLineText);
});
Handlebars.registerHelper( "join", function( array, sep, options ) {
	return array.map(function( item ) {
		return options.fn( item );
	}).join( sep );
});
//  format an ISO date using Moment.js
//  http://momentjs.com/
//  moment syntax example: moment(Date("2011-07-18T15:50:52")).format("MMMM YYYY")
//  usage: {{dateFormat creation_date format="MMMM YYYY"}}
Handlebars.registerHelper('formatDate', function(context, block) {
	if (window.moment) {
		var f = block.hash.format || "YYYY-MM-DD HH:mm";
		return moment(Date(context)).format(f);
	}else{
		return context;//moment plugin not available. return data as is.
	};
});
Handlebars.registerHelper('formatJsonDate', function(context, block) {
	if (window.moment) {
		var f = block.hash.format || "YYYY-MM-DD";
		return moment(context.time).format(f);
	}else{
		return context;
	};
});
Handlebars.registerHelper('formatJsonTime', function(context, block) {
	if (window.moment) {
		var f = block.hash.format || "HH:mm";
		return moment(context.time).format(f);
	}else{
		return context;
	};
});


//depends on: jq, Handlebars
var Utils = {
	tmpl: function(id){
		return Handlebars.compile(jq("#" + id).html());
	},
	registerPartial: function(id, name){
		if(!name){
			name = (id.indexOf("tmpl-") === 0) ? id.substring(5) : id;
		}
		var templateContent = jq("#" + id).html();
		Handlebars.registerPartial(name, templateContent);
	},
	tmplPartial: function(id, name){
		if(!name){
			name = (id.indexOf("tmpl-") === 0) ? id.substring(5) : id;
		}
		var templateContent = jq("#" + id).html();
		Handlebars.registerPartial(name, templateContent);
		return Handlebars.compile(templateContent);
	},
	startLoader: function(event){
		var button = jq(event.currentTarget);
		var ladda = jq(button).ladda();
		ladda.ladda( 'start' );
	},
	stopLoader: function(sourceEvent){
		var button = jq(sourceEvent.currentTarget);
		var ladda = jq(button).ladda();
		ladda.ladda( 'stop' );
	},
	uuid: function () {
		/*jshint bitwise:false */
		var i, random;
		var uuid = '';

		for (i = 0; i < 32; i++) {
			random = Math.random() * 16 | 0;
			if (i === 8 || i === 12 || i === 16 || i === 20) {
				uuid += '-';
			}
			uuid += (i === 12 ? 4 : (i === 16 ? (random & 3 | 8) : random))
				.toString(16);
		}
		return uuid;
	}
};