var Utilities = {

	loadYUIScripts : function(scripts, callback) {
		var $ = Utilities;
		
		if (!$.isValid(scripts)) { return; }
	
		var loader = new YAHOO.util.YUILoader({
			base: "", 
			require: scripts, 
			loadOptional: false, 
			combine: true, 
			filter: "MIN", 
			allowRollup: true,
			onSuccess: Calendar.init_ScriptsLoaded
		});
		
		return loader;	
	},

	createFormElement : function(parent, elementType, attributes, className, value) {
		var $ = Utilities, element, i, newNode;
		
		if (typeof elementType == "undefined" || elementType == null || elementType == "")
		{
			element = document.createTextNode(value);
		}
		else
		{
			element = document.createElement(elementType);
			
			for (i = 0; i < attributes.length; i++)
			{
				if (attributes[i].name != "style")
				{
					element.setAttribute(attributes[i].name, attributes[i].value);
				}
				else
				{
					$.setElementStyle(element, attributes[i].value);
				}
			}
			if (className != "")
			{
				element.className = className;
			}
			if (value != "")
			{
				if (elementType != "input")
				{
					newNode = document.createTextNode(value);
					element.appendChild(newNode);
				}
				else
				{
					element.value = value;					
				}
			}
		}
		
		if (parent != null && parent != "")
		{
			parent.appendChild(element);
		}				

		return element;
	},

	insertNodeAfter : function(existingNode, nodeToInsert) {
		if (typeof existingNode === "undefined" || existingNode === null) { return; }
		if (typeof nodeToInsert === "undefined" || nodeToInsert === null) { return; }
		
		existingNode.parentNode.insertBefore(nodeToInsert, existingNode.nextSibling);
	},

	isValid : function (object) {
		var ret = true;
		
		if (typeof object == "undefined" || object == null) { ret = false; }
		
		return ret;
	},
	
	padNumber : function(number, digits) {
		return String("0" + number).slice(-digits);
	},	
	
	convertDateTimeToString : function(date, format) {
		// _dn: day name (eg. Monday)
		// _ds: short day name (eg. Mon)
		// _dd: date [padded]
		// _d : date [unpadded]
		// _dx: date suffix (eg, st, nd)
		// _MM: month [padded] 
		// _M : month [unpadded]
		// _MN: month name (eg. January)
		// _MS: short month name (eg. Jan)
		// _yy: year [2 digit]
		// _yyyy: year [4 digit]
		// _HH: 24 hours hour[padded]
		// _H : 24 hours hour [unpadded]
		// _hh: 12 hours hour[padded]
		// _h : 12 hours hour [unpadded]
		// _hx: time suffix (am, pm)
		// _mm: minutes[padded]
		// _m : minutes [unpadded]
		// _ss: seconds[padded]
		// _s : seconds [unpadded]
		
		var $ = Utilities;
		
		if (!$.isValid(date)) { return ""; }
		
		if (format == null || format == "") { format = "dd/mm/yyyy"; }
		
		var tokenRegex = /(_MM|_MN|_MS|_M|_yyyy|_yy|_ss|_s|_mm|_m|_hx|_HH|_hh|_H|_h|_dx|_dn|_ds|_dd|_d){1}/g;
		var tokens = new Array();
		var result, output = format;
		while ((result = tokenRegex.exec(format)) != null)
		{
			tokens.push(result);
		}
		
		if (tokens.length > 0)
		{
			for (var i = tokens.length - 1; i >= 0; i--)
			{
				format = format.substr(0, tokens[i].index) + $.convertDateTimeToken(date, tokens[i][0]) + format.substring(tokens[i].index + tokens[i][0].length, format.length);
			}
		}
		
		return format;
	},
	
	convertDateTimeToken : function(date, token) {
		var $ = Utilities;
		
		var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
		var shortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
		var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
		var shortDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
		var dateSuffix = ["st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "st"];		
		var result = "";
		
		token = YAHOO.lang.trim(token);
		
		// month
		if (token == "_MM") result = $.padNumber(date.getMonth() + 1, 2);
		else if (token == "_MN") result = months[date.getMonth()];
		else if (token == "_MS") result = shortMonths[date.getMonth()];
		else if (token == "_M") result = date.getMonth() + 1;
		
		// year
		else if (token == "_yyyy") result = $.padNumber(date.getFullYear(), 4);
		else if (token == "_yy") result = $.padNumber(date.getFullYear().toString().substr(2, 2), 2);
		
		// seconds
		else if (token == "_ss") result = $.padNumber(date.getSeconds(), 2);
		else if (token == "_s") result = date.getSeconds();
		
		// minutes
		else if (token == "_mm") result = $.padNumber(date.getMinutes(), 2);
		else if (token == "_m") result = date.getMinutes();
		
		// hours suffix
		else if (token == "_hx") result = date.getHours() > 11 ? "pm" : "am";
		// hours
		else if (token == "_HH") result = $.padNumber(date.getHours(), 2);
		else if (token == "_hh") result = date.getHours() > 12 ? $.padNumber(date.getHours() - 12, 2) : date.getHours() == 0 ? 12 : $.padNumber(date.getHours());
		else if (token == "_H") result = date.getHours();
		else if (token == "_h") result = date.getHours() > 12 ? date.getHours() - 12 : date.getHours() == 0 ? 12 : date.getHours();

		// date suffix
		else if (token == "_dx") result = dateSuffix[date.getDate() - 1];		
		
		// day
		else if (token == "_dn") result = days[date.getDay()];
		else if (token == "_ds") result = shortDays[date.getDay()];
		
		// date
		else if (token == "_dd") result = $.padNumber(date.getDate(), 2);
		else if (token == "_d") result = date.getDate();			
			
		return result;
	},	
	
	convertYUICalendarReturnToDate : function(args) {
		var $ = Utilities;
		var lang = YAHOO.lang;
		
		if (!$.isValid(args)) { return null; }
		if (!lang.isArray(args)) { return null; }
		if (!$.isValid(args[0])) { return null; }
		if (!lang.isArray(args[0])) { return null; }
		if (!$.isValid(args[0][0])) { return null; }
		if (!lang.isArray(args[0][0])) { return null; }
		
		var arg = args[0][0];
		return new Date(arg[0], arg[1] - 1, arg[2], 0, 0, 0, 0);
	},
	
	setElementStyle : function(element, style) {
		if (element.style)
		{
			element.style.cssText = style;
		}
		else
		{
			element.cssText = style;
		}	
	}		


};

