// default.js
// Copyright (C) 2005-2006 H. Adam Mill II
// Copyright (C) 2006 ImarcsGroup.com

// **** General ****

// Extend an object with another objects properties.
var extend = function(target, source)
{
	for(var property in source)
		target[property] = source[property];
};


// **** DOM Utilities ****
var DOMUtils = 
{
	// Get an element.
	getElement : function(element, deft)
	{
		if(null == element)
			return deft;
		else if("string" == typeof element)
		{
			element = document.getElementById(element)
			if(!element)
				return deft;
		}
		return element;	
	}
};


// **** Event Utilities ****
var EventUtils = {
   listen : function(type, listener, element)
   {
		if(element instanceof Array)
		{
			for(var loop=0; loop < element.length; loop++)
				EventUtils.listen(type, listener, element[loop]);
			return;
		}	
		element = DOMUtils.getElement(element, window);
		if(element.addEventListener)
			element.addEventListener(type, listener, false);
		else if(element.attachEvent)
			element.attachEvent("on" + type, listener);
		else
			throw "No method found for adding event listeners to '" + String(element) + "'.";
   },
   getEvent : function(evt)
   {
		if (!evt)
			evt = window.event;	
		return evt;
   },
	getEventTarget : function(evt)
	{
		var target = null;
		if(evt.target)
			target = evt.target;
		else if(evt.srcElement)
			target = evt.srcElement;
		if(target && target.nodeType == 3)
			target = target.parentNode;
		return target;
	},
   cancelEvent : function(evt)
   {
		evt = EventUtils.getEvent(evt);
		evt.cancelBubble = true;
		if(evt.preventDefault)
			evt.preventDefault();
		return false;
   }
};


// **** Size Utilities. ****
// Reference: http://www.quirksmode.org/viewport/compatibility.html
var SizeUtils =
{
	screen :
	{
		getHeight : function()
		{
			if(window.screen)
				return window.screen.height;
			else
				throw "Unable to determine screen height.";
		},
		getWidth : function()
		{
			if(window.screen)
				return window.screen.width;
			else
				throw "Unable to determine screen height.";
		}
	},
	scroll :
	{
		getVertical : function()
		{
			if(document.all)
				return document.body.scrollTop;
			else
				return window.pageYOffset;
		},
		getHorizontal : function()
		{
			if(document.all)
				return document.body.scrollLeft;
			else
				return window.pageXOffset;				
		}
	},
	window : 
	{	
		getHeight : function()
		{
			if(window.innerHeight)
				return window.innerHeight;
			else if(document.documentElement && document.documentElement.clientHeight)
				return document.documentElement.clientHeight;
			else if(document.body)
				return document.body.offsetHeight;
			else
				throw "Unable to determine window height.";
		},
		getWidth : function()
		{
			if(window.innerWidth)
				return window.innerWidth;
			else if(document.documentElement && document.documentElement.clientWidth)
				return document.documentElement.clientWidth;
			else if(document.body)
				return document.body.offsetWidth;
			else
				throw "Unable to determine window width.";
		},
		getOuterHeight : function()
		{
			if(window.outerHeight)
				return window.outerHeight;
			else
				throw "Unable to determine window outer height.";
		},
		getOuterWidth : function()
		{
			if(window.outerWidth)
				return window.outerWidth;
			else
				throw "Unable to determine window outer width.";
		}
	},
	element :
	{
		getHeight : function(element)
		{
			element = DOMUtils.getElement(element);
			if(element.offsetHeight)
				return element.offsetHeight;
			else
				throw "Unable to determine element height.";
		},
		getWidth : function(element)
		{
			element = DOMUtils.getElement(element);
			if(element.offsetWidth)
				return element.offsetWidth;
			else
				throw "Unable to determine element width.";				
		}
	}
};

// **** Date Utilities. ****
var DateUtils = 
{
	toAge : function(year, month, day)
	{
		year = DateUtils.getYear(year);
		month = DateUtils.getMonth(month);
		day = DateUtils.getDay(day);
		var date = new Date(year, month-1, day);
		var today = new Date();
		var age = today.getFullYear() - date.getFullYear();
		date.setFullYear(today.getFullYear())
		if(date > today)
			age--;
		return age;
	},
	getParts : function(year, month, day)
	{
		var date = { year : null, month : null, day : null };
		date['year'] = DateUtils.getYear(year);
		date['month'] = DateUtils.getMonth(month);
		date['day'] = DateUtils.getDay(day);
		if(date['year'] == null)
			return null;
		if(date['month'] == null)
			return null;
		if(date['day'] == null)
			return null;
		return date;
	},
	getYear : function(year)
	{
		year = parseInt(year);
		if(isNaN(year))
			return null;
		if(year < 100)
		{
			if(year > 49)
				year += 1900;
			else
				year += 2000;
		}
		return year;
	},
	getMonth : function(month)
	{
		month = parseInt(month);
		if(isNaN(month) || month < 1 || month > 12)
			return null;
		return month;
	},
	getDay : function(day)
	{
		day = parseInt(day);
		if(isNaN(day) || day < 1 || day > 31)
			return null;
		return day;
	}
};

// **** Form Utilities. ****
var FormUtils = 
{
	// Get field value.
	getFieldValue : function(form, field)
	{
		field = FormUtils.getFormField(form, field);
		if(!field)
			return null;
		if(null == field.type)
		{
			var type = field[0].type;
			if("radio" == type)
			{
				for(var loop=0; loop < field.length; loop++)
					if(true == field[loop].checked)
						return field[loop].value;
			}
		}
		else
		{
			var type = field.type;
			if((type == "text") || (type == "password") || (type == "textarea") || (type == "hidden") || (type == "file"))
				return field.value;
			else if(type == "checkbox")
			{
				if(true == field.checked)
					return "Y";
				else
					return "";
			}
			else if("radio" == type)
			{
				if(true == field.checked)
					return field.value;
			}		
			else if(type == "select-one")
			{
				for(var loop=0; loop < field.options.length; loop++)
				{
					if(true == field.options[loop].selected)
						return field.options[loop].value;
				}
				return false;
			}
			else if(type == "select-multiple")
			{
				var value = "";
				for(var loop=0; loop < field.options.length; loop++)
				{
					if(true == field.options[loop].selected)
					{
						if("" != value)
							values += ",";
						values += field.options[loop].value;
					}
				}
				return value;
			}
			// NOTE: Ignore button, image, and submit types
		}
		return null;
	},
	getFormField : function(form, field)
	{
		form = DOMUtils.getElement(form, null);
		if(!form)
			return null;
		return form[field];
	}
};

// **** Array Utilities ****
var ArrayUtils =
{
	// Does the array contain the value.
	contains : function(list, value)
	{
		if(null == list)
			return false;	
		if(list.indexOf)
			return (list.indexOf(value) != -1);
		for(var loop=0; loop < list.length; loop++)
			if(value == list[loop])
				return true;
		return false;
	},
	// Remove duplicate entries from an array.
	removeDuplicates : function(list)
	{
		if(null == list)
			return null;	
		var ary = [ ];
		for(var loop=0; loop < list.length; loop++)
		{
			if(!ArrayUtils.contains(ary, list[loop]))
				ary.push(list[loop]);
		}
		return ary;
	}   
};
