﻿//-------------------------------------------------------------  AJAX  ----------------//

if(typeof($) == 'function')
{
	function SendRequest(sPath, oArgs, fCallback)
	{
		try
		{
			$.get
			(
				sPath
				, oArgs
				, function(result) { fCallback(result); }
			);
		} catch (e) { throwException('SendRequest()', e.lineNumber, e, e.message); }
	}
}

function GetContent(result, id, tagname, returnFirst)
{
	var div = document.createElement("DIV");
	div.innerHTML = result;

	var elelist = div.getElementsByTagName(tagname.toUpperCase());
	var html = "";
	if(returnFirst)
	{
		return elelist[0].innerHTML;
	}
	else
	{
		for (var i = 0; i < elelist.length; i++)
		{
			if (elelist[i].id == id)
			{
				html = elelist[i].innerHTML;
			}
		}
	}

	return html;
}

function GetElement(result, index, tagname)
{
	var div = document.createElement("DIV");
	div.innerHTML = result;

	var elelist = div.getElementsByTagName(tagname.toUpperCase());
	if(index < elelist.length)
	{
		return elelist[index];
	}
	return null;
}

function GetElementById(result, id, tagname)
{
	var div = document.createElement("DIV");
	div.innerHTML = result;

	var elelist = div.getElementsByTagName(tagname.toUpperCase());
	var html = "";
	for (var i = 0; i < elelist.length; i++)
	{
		if (elelist[i].id == id)
		{
			html = elelist[i];
		}
	}

	return html;
}


/* ------------------------------ LOCATION Functions ------------------------ */

function WebAddress(undefined)
{

	var Valid = (typeof(Valid) != undefined && Valid != null) ? Valid : new Validator() ;

	var findKey = function(p)
	{
		return new RegExp("[?&]" + p + "=(?:([^&]*))?", "i");
	}
	var multiAmp = new RegExp("[&+]+", "g");

	pub = 
	{
		AddQueryParam: function (key, value, qs)
		{

			qs = this.StripQueryParam(key, qs);
			qs = key + "=" + value + "&" + (qs ? "&" + qs : "");
			qs = qs.replace("?", "").replace(multiAmp, "&");

			return qs;
		}
		, StripQueryParam: function (parameter, qs)
		{
			qs - qs.replace("?", "");

			var p = escape(unescape(parameter));
			if (qs.indexOf(parameter + "=") == 0)
			{
				qs = qs.substring(qs.indexOf("&") + 1);
				return qs
			}

			qs = qs.replace((findKey(parameter)), "").replace(multiAmp, "&");
			if(qs.charAt(0) == "&"){ qs = qs.substring(1); }

			return qs;
		}
		, GetQueryParam: function (parameter, qs)
		{
			qs = "&" + qs;
			var p = escape(unescape(parameter));

			var match = (findKey(p)).exec(qs);
			var value = "";
			if (match != null)
			{
				value = Trim(unescape(match[1]));
			}
			return value;
		}
		, GetHash:function()
		{
			var href = (Valid.String(arguments[0])?arguments[0]:location.hash);
			if(!Contains(href, "#"))
			{
				return "";
			}
			else
			{
				href = href.substring(href.indexOf("#"));
				return href;
			}
		}
	};

	return pub;
};
var Location = new WebAddress();

/* ------------------------------ Formatting Functions ------------------------ */

function ValueToInt(value)
{
	value = RemoveNonNumbers(value);
	return (!value || isNaN(value)) ? 0 : parseInt(value);
}

function FormatPath(str)
{
	str = trimSlashes(str);
	
	if(str.indexOf("/") == -1) //no segments, so don't process
	{
		str = NameToFileName(str);
	}
	else
	{
		var segments = str.split("/");
		str = "";
		for(var i = 0; i < segments.length; i++)
		{
			str += "/" + NameToFileName(segments[i]);
		}
		str = trimSlashes(str) + "/";
	}
	
	return str;
}

function StripHtml(str)
{
	return str.replace(/(<([^>]+)>)/ig,"");
}


function trimSlashes (str) {
	if(str == null || str == ""){ return "";}
	
	var	str = str.replace(/^\/\/*/, ''),
		ws = /\//,
		i = str.length;
	while (ws.test(str.charAt(--i)));
	return str.slice(0, i + 1);
}


function HtmlDecode(str)
{
	var amp = new RegExp("&amp;", "g");

	str = str.replace(amp, "&");

	return str;
}

function EncodePath(path)
{
	path = Replace(path, "%20", " ");
	path = Replace(escape(path), "\\s|%20", "+");

	return path;
}

function NameToFileName(str)
{
	str = Trim(str).toLowerCase()

	str = str.replace(/\s|&#160;|&nbsp;/g, '-');
	str = str.replace(/&|&#38;|&#038;|&amp;/g, 'and');
	str = str.replace(/%|&#37;|&#037;/g, '-per-cent');
	str = str.replace(/_/, '-');

	str = str.replace(/[^\w+]/g, '-');

	str = str.replace(/[-+]+/g, '-');
	
	str = Trim("-"+str, "-");
	if(str.charAt(0) == "-"){ str = str.substring(1); }
	
	return str;
}

function EncodeQueryString(str)
{
	var fchar = "";
	if(str.charAt(0) == "?" || str.charAt(0)== "&")
	{
		fchar = str.charAt(0);
		str = str.substring(1);
	}

	var items = str.split("&");
	var qs = "";
	var item = "";
	for (var pair in items)
	{
		item = pair.split("=");
		item[1] = escape(item[1]);
		pair = item[0] + "=" + item[1];
		qs += "&" + pair;
	}
	
	qs = fchar + qs.subtring(1);
}

function TrimLeft(str)
{
	var trim = /^\s+/;
	if(arguments[1] != null){ trim = ""+RegExp(arguments[1] + "+", ""); }
	return str.replace(trim, '');
}
function TrimRight(str)
{	
	var trim = /\s+$/;
	if (arguments[1] != null) { trim = RegExp(arguments[1] + "+$", "g"); }
	return str.replace(trim, '');
}
function Trim(str)
{
	return TrimLeft(TrimRight(str, arguments[1]), arguments[1]);
}

function RemoveNonNumbers(str)
{
	if (str == null || str == "") { return ""; }

	return Replace(str, "[^0-9]", "");
}

function Replace(source, find, replacement)
{
	if (typeof(source) != 'string' || !source || !find) { return source; }

	var re = new RegExp(find, "g");
	return source.replace(re, replacement);
}

function RemoveChildObjects(oSource)
{
	while(oSource.hasChildNodes())
	{
		oSource.removeChild(oSource.firstChild);
	}
}

function AbbreviateFileSize(num)
{
	if (isNaN(num)) { return num; }

	var moniker = "kb";

	if (num >= 1073741824)
	{
		num = num / 1073741824;
		moniker = "gb";
	}
	else if (num >= 1048576)
	{
		num = num / 1048576;
		moniker = "mb";
	}
	else
	{
		num = num / 1024;
	}

	num = num + "";
	if (num.indexOf(".") > -1)
	{
		num = num.substring(0, num.indexOf(".") + 2);
		if (num.charAt(num.length - 1) == "0")
		{
			num = num.substring(0, num.indexOf("."));
		}
	}

	return num + moniker
}


/* ------------------------------ Utility Functions ------------------------ */

function Contains(source, value)
{
	try
	{
		return (source.indexOf(value) > -1 ? true : false);
	}
	catch (e)
	{
		throwException('/functions.js : Contains()', e.lineNumber, e, e.message);
	}

	return false
}

function FindControl(oSource, id)
{
	if ((oSource == null || oSource == "") || (id == null || id == "")) { return null; }
	
	var oObj = null;

	var html = (typeof (oSource) == "object")
		? oSource.innerHTML
		: oSource
	;


	var re = new RegExp("id=\"?[\\w]+", "g");
	var m = html.match(re);
	
	if (m != null)
	{
		var mid = "";
		var stpos = 4;
		for (var i = 0; i < m.length; i++)
		{

			if (m[i].indexOf('"') != -1)
			{
				stpos = m[i].indexOf('"') + 1;
			}
			else if (m[i].indexOf('=') != -1)
			{
				stpos = m[i].indexOf('=') + 1;
			}
			if (Contains(m[i], id))
			{
				mid = m[i].substring(stpos, m[i].length);
				oObj = document.getElementById(mid);
				break;
			}
		}
	}

	return oObj;
}

function FindFormField(name)
{
	var useid = (arguments[1] != null)
		? arguments[1]
		: true
	;
	
	var fct = document.forms[0].length;
	if (useid)
	{
		for (var i = fct - 1; i >= 0; i--)
		{
			if (Contains(document.forms[0][i].id, name))
			{
				return document.forms[0][i];
			}
		}
	}
	else
	{
		for (var i = fct - 1; i >= 0; i--)
		{
			if (Contains(document.forms[0][i].name, name))
			{
				return document.forms[0][i];
			}
		}
	}
}

function ListProperties(obj)
{
	var obj_props = "";
	for (var i in obj)
	{
		if (arguments[1]) { var msg = arguments[1] + "." + i + " : " + obj[i]; } else { var msg = i + " : " + obj[i]; }
		obj_props += msg + "\n";

		if (typeof obj[i] == "object")
		{
			if (arguments[1]) { ListProperties(obj[i], parent + "." + i); } else { ListProperties(obj[i], i); }
		}
	}
	return obj_props;
}

function PathAndQuery(sPath, oQuery)
{
	var qs = "";
	for (var i in oQuery)
	{
		qs += "&" + i + "=" + oQuery[i];
	}
	return sPath + "?" + qs;
}


/* ------------------------------ Validation Functions ------------------------ */

function Validator(oForm, flagClass, submitOnEnter, undefined)
{
	var fields = [];
	if(oForm)
	{
		for(var i = 0; i < oForm.length; i++)
		{
			if(oForm[i].getAttribute('validate'))
			{
				oForm[i].Validation = oForm[i].getAttribute('validate');
				oForm[i].Target = oForm[i].getAttribute('target');
				oForm[i].Message = oForm[i].getAttribute('message');
				oForm[i].Label = oForm[i].getAttribute('label');

				fields.push(oForm[i]);
			}

			if(submitOnEnter && oForm[i].tagName != "TEXTAREA")
			{
				oForm[i].onkeypress = submitOnEnter;
			}
		}
	}

	var pub = 
	{
		Count: fields.length
		, Controls: {Submit:null, Clear:null, Cancel: null}
		, SetControls: function(oSubmit, oCancel, oClear)
		{
			if(oSubmit)
			{
				pub.Controls.Submit = oSubmit;
				pub.Controls.Submit.onclick = pub.Validate;
			}

			if(oCancel)
			{

			}

			if(oClear)
			{

			}
		}
		, Validate: function()
		{
			try
			{
				if(fields && fields.length > 0)
				{
					var field = null; //current field
					var valid = false;

					for(var i = 0; i < fields.length; i++)
					{
						valid = false;
						field = fields[i];

						switch(field.Validation.toLowerCase())
						{
							case "notnull":
								valid = pub.String(field.value);
							break;
							case "email":
								valid = pub.EmailAddress(field.value);
							break;
							case "number":
								valid = (field.value && !isNaN(field.value));
							break;
							case "phone":
								valid = pub.PhoneUS(field.value);
							break;
							case "zipcode":
								valid = pub.ZipCodeUS(field.value);
							break;
							case "date":
								valid = pub.Date(field.value, 'm/d/y');
							break;
						}

						//set flag class
						if(!valid)
						{
							$(field).addClass(flagClass);
							field.setAttribute("title", field.Message);
						}
						else
						{
							$(field).removeClass(flagClass);
							field.setAttribute("title", "");
						}
					}
				}
			}
			catch(e)
			{
				throwException('Validator.Validate()', e.lineNumber, e, e.message); 
			}
			return false;
		}
		, RegExp:{
			ZipCodeUs: /(^\d{5}$)|(^\d{5}-\d{4}$)/
			, EmailAddress:/^([\w]+)(\.[\w]+)*@([\w\-]+)(\.[\w]{2,7})(\.[a-z]{2})?$/i
			, Date: 
			{
				'm/d/y':{
					're':/(\d{1,2})[./-](\d{1,2})[./-](\d{2}|\d{4})/,
					'exact':/^(\d{1,2})[./-](\d{1,2})[./-](\d{2}|\d{4})$/,
					'month': 1,'day': 2, year: 3
				},
				'mm/dd/yy':{
					're':/(\d{1,2})[./-](\d{1,2})[./-](\d{2})/,
					'exact':/^(\d{1,2})[./-](\d{1,2})[./-](\d{2})$/,
					'month': 1,'day': 2, year: 3
				},
				'mm/dd/yyyy':{
					're':/(\d{1,2})[./-](\d{1,2})[./-](\d{4})/,
					'exact':/^(\d{1,2})[./-](\d{1,2})[./-](\d{4})$/,
					'month': 1,'day': 2, year: 3
				},
				'y/m/d':{
					're':/(\d{2}|\d{4})[./-](\d{1,2})[./-](\d{1,2})/,
					'exact':/^(\d{2}|\d{4})[./-](\d{1,2})[./-](\d{1,2})$/,
					'month': 2,'day': 3, year: 1
				},
				'yy/mm/dd':{
					're':/(\d{1,2})[./-](\d{1,2})[./-](\d{1,2})/,
					'exact':/^(\d{1,2})[./-](\d{1,2})[./-](\d{1,2})$/,
					'month': 2,'day': 3, year: 1
				},
				'yyyy/mm/dd':{
					're':/(\d{4})[./-](\d{1,2})[./-](\d{1,2})/,
					'exact':/^(\d{4})[./-](\d{1,2})[./-](\d{1,2})$/,
					'month': 2,'day': 3, year: 1
				}
				, ShowDateFormats: function()
				{
					alert("Supported Date Formats:\n\tm/d/y\n\tmm/dd/yy\n\tmm/dd/yyyy\n\ty/m/d\n\tyy/mm/dd\n\tyyyy/mm/dd");
				}
			}
		}
		, Object: function(arg)
		{
			//if(!arg){ return false; }
			if(arg == ""){ return false; }
			else if(arg == null){ return false; }
			else if(typeof(arg) == 'undefined'){ return false; }
	
			return true;
		}
		, String: function(str)
		{
			//if(!arg){ return false; }
			if(str == ""){ return false; }
			else if(str == null){ return false; }
			else if(typeof(str) == 'undefined'){ return false; }
	
			str = Trim(str);
			if(str == ""){ return false; }
			else{ return true; }
		}
		, ZipCodeUS: function(str)
		{
			return pub.RegExp.ZipCodeUs.test(str);
		}
		, PhoneUS: function(str)
		{
			str = RemoveNonNumbers(str);
			if(!str){return false;}

			var ct = str.length;
			if(ct == 10 || (str.charAt(0) == "1" && ct == 11)){ return true;}

			return false;
		}
		, EmailAddress: function(str)
		{
			return pub.RegExp.EmailAddress.test(str);
		}
		, Date: function(date_string, format)
		{
			var rtrn = false;

			var days = [0,31,28,31,30,31,30,31,31,30,31,30,31];
			var year, month, day, date_parts = null;
			var decisionTree = pub.RegExp.Date;

			var test = decisionTree[format];
			if (test) 
			{
	
				var re = new RegExp(test.re);
				var m = re.exec(date_string);
		
				if(m != null)
				{
					date_string = m[0];
					date_parts = date_string.match(test.re);
					if (date_parts) {
						year = date_parts[test.year];
						month = date_parts[test.month];
						day = date_parts[test.day];

						test = (month == 2 && 
								isLeapYear() && 
								29 || 
								days[month] || 0);

						rtrn = 1 <= day && day <= test;
					}
				}
		
			}
	
			if(arguments[2] === true)
			{	//return date parts: mm/dd/yyy = mm, dd, yyyy
				return m;
			}
			else
			{
				return rtrn;
			}
	
		}
		, IsLeapYear: function(year)
		{
			return isLeapYear(year);
		}
		, InputCount: function(containerID, arrTagNames)
		{
			var oContainer = document.getElementById(containerID);
			var sortByType = (arguments[2] != null)? arguments[2] : false;
	
			var input = null;
			var ct = [];
			for(var i = 0; i < arrTagNames.length; i++)
			{
				input = oContainer.getElementsByTagName(arrTagNames[i].toUpperCase());
				ct.push(input.length);
			}
	
			if(!sortByType)
			{
				var total = 0;
				for(var i = 0; i < arrTagNames.length; i++)
				{
					total += ct[i];
				}
				ct = total;
			}
	
			return ct; 
		}
	};

	function isLeapYear() 
	{
		return (year % 4 != 0 ? false : 
			( year % 100 != 0? true: 
			( year % 1000 != 0? false : true)));
	}

	function submitOnEnter(e)
	{
		if (!e) {e = event;}
		if (e.which == 13 || e.keyCode == 13)
		{
			$(pub.Controls.Submit).click();
		}
		return true;
	}

	return pub;
}


function ArrayFunctions($, undefined)
{
	var pub = 
	{
		Contains: function(haystack, needle)
		{
			return (pub.Position(haystack, needle) > -1 ? true : false);
		}
		, Position: function(haystack, needle)
		{
			if(!haystack || !needle){ return -1; }

			if(typeof(haystack) == 'string')
			{
				return haystack.indexOf(needle);
			}
			else if(typeof(haystack) == 'object')
			{
				var pos = 0;
				var exists = false;
				for(obj in haystack)
				{
					if(haystack[obj] == needle)
					{
						exists = true;
						break;
					}
					pos++;
				}

				return (exists ? pos : -1);
			}
		}
		, LastIndex: function(array)
		{
			if(!array || array.length == 0){return -1;}
			return array[array.length -1];
		}
	};

	return pub;
}
var Collections = new ArrayFunctions(jQuery);



/* ------------------------------ Error Handling Functions ------------------------ */

function throwException(file_name, line_num, ex, msg)
{

	var msg = "Error in FILE: " + file_name + " LINE: " + line_num + "\n\nTYPE: " + ex + "\n\n" + msg + "\n\n" + ex.stack;

	if (document.getElementById('error_div'))
	{
		document.getElementById('error_div').innerHTML = "<pre class=\"error\">" + msg + "</pre>";
	} 
	else
	{
		alert(msg);
	}

}


