/**
 * @projectDescription Helper functions
 * @author Jerome Wilson
 */

// *** Strings ***

var DateText = {
	"month_0"		: "January",
	"month_1"		: "February",
	"month_2"		: "March",
	"month_3"		: "April",
	"month_4"		: "May",
	"month_5"		: "June",
	"month_6"		: "July",
	"month_7"		: "August",
	"month_8"		: "September",
	"month_9"		: "October",
	"month_10"		: "November",
	"month_11"		: "December",
	
	"weekday_0"		: "Sunday",
	"weekday_1"		: "Monday",
	"weekday_2"		: "Tuesday",
	"weekday_3"		: "Wednesday",
	"weekday_4"		: "Thursday",
	"weekday_5"		: "Friday",
	"weekday_6"		: "Saturday"	
};


// *** Helper Functions ***

// *** Date

var DateHelper = {

	"dayName": function(dayOfWeekNumber) {
		return DateText["weekday_" + dayOfWeekNumber];
	},

	"monthName": function(monthNumber) {
		return DateText["month_" + monthNumber];
	},
	
	"diff": function(dateFrom, dateTo, units) {
		switch (units) {
			case "m": // months
				return ((dateTo.getFullYear() - dateFrom.getFullYear()) * 12) + (dateTo.getMonth() - dateFrom.getMonth());
			case "y": // years
				return dateTo.getFullYear() - dateFrom.getFullYear();
			case "h": // hours
				return Math.round((dateTo.valueOf() - dateFrom.valueOf()) / 3600000);
			case "n": // minutes
				return Math.round((dateTo.valueOf() - dateFrom.valueOf()) / 3600000);
			case "s": // seconds
				return Math.round((dateTo.valueOf() - dateFrom.valueOf()) / 60000);
			default: // days
				return Math.round((dateTo.valueOf() - dateFrom.valueOf()) / 86400000);
		}
	},

	"format": function(date, format) {
	    return format.replace(/(yyyy|mmmm|mmm|mm|dddd|ddd|dd|d|hh|nn|ss|a\/p|\^)/gi,
	        function($1) {
	            switch ($1.toLowerCase()) {
		            case 'yyyy': return date.getFullYear();
		            case 'mmmm': return DateHelper.monthName(date.getMonth());
		            case 'mmm':  return DateHelper.monthName(date.getMonth()).substr(0, 3);
		            case 'mm':   return (date.getMonth() + 1).padLeft(2, '0');
		            case 'dddd': return DateHelper.dayName(date.getDay());
		            case 'ddd':  return DateHelper.dayName(date.getDay()).substr(0, 3);
		            case 'dd':   return date.getDate().padLeft(2, '0');
		            case 'd':	 return date.getDate();
		            case 'hh':   return ((h = date.getHours() % 12) ? h : 12).padLeft(2, '0');
		            case 'nn':   return date.getMinutes().padLeft(2, '0');
		            case 'ss':   return date.getSeconds().padLeft(2, '0');
		            case 'a/p':  return date.getHours() < 12 ? 'a' : 'p';
					case '^':  
					    switch (date.getDate())
					        {
					        case 1:
					        case 21:
					        case 31:
					            return "st";
					        case 2:
					        case 22:
					            return "nd";
					        case 3:
					        case 23:
					            return "rd";
					        default:
					            return "th";
					        }
				}
	        }
	    );
	}
	
};

Date.prototype.monthName = function() {
	return DateHelper.monthName(this.getMonth());
};

Date.prototype.dayName = function() {
	return DateHelper.dayName(this.getDay());
};

Date.prototype.diff = function(comparisonDate, units) {
	return DateHelper.diff(this, comparisonDate, units);
};

Date.prototype.format = function(format) {
	return DateHelper.format(this, format);
};


// *** String

String.prototype.format = function(text1, text2, text3) {
	var result = String(this);
	
	for (var i = 0; i < arguments.length; i++) {
		result = result.replace(new RegExp("\\{" + i + "\\}"), arguments[i]);
	}
	result = result.replace(/\{\d\}/g, "");
	return result;
};

String.prototype.startsWith = function(text) {
	return (this.length >= text.length && this.substring(0, text.length) == text);
};

String.prototype.endsWith = function(text) {
	return (this.length >= text.length && this.substring(this.length - text.length) == text);
};

String.prototype.padLeft = function(num, character) {
	var padded = String(this);
	
	while (padded.length < num) {
		padded = character + padded;
	}
	return padded.substr(0, num);
};

String.prototype.padRight = function(num, character) {
	var padded = String(this);
	
	while (padded.length < num) {
		padded += character;
	}
	return padded.substr(0, num);
};


// *** Number ***

Number.prototype.padLeft = function(num, character) {
	return this.toString().padLeft(num, character);
};

Number.prototype.padRight = function(num, character) {
	return this.toString().padRight(num, character);
};
