﻿//-------------------------------------------------------------  AJAX  ----------------//

if(typeof($) == 'function')
{
	function SendRequest(sPath, oArgs, fCallbackSuccess, fCallbackFail)
	{
		try
		{
			$.get
			(
				sPath
				, oArgs
				, function(result) { fCallbackSuccess(result); }
				, function() { if(typeof(fCallbackFail) == 'function'){fCallbackFail();}else{return;} }
			);
		} 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 = null;

	if(typeof(result) == "string")
	{
		div = document.createElement("DIV");
		div.innerHTML = result;
	}
	else
	{
		div = result;
	}

	var html = "";
	if(div)
	{
		var elelist = div.getElementsByTagName(tagname.toUpperCase());
		for (var i = 0; i < elelist.length; i++)
		{
			if (elelist[i].id == id)
			{
				html = elelist[i];
				break;
			}
		}
	}

	return html;
}


/* ------------------------------ LOCATION Functions ------------------------ */

function WebAddress()
{
	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;
		}
	}

	return pub;
};
var Location = new WebAddress();

/* ------------------------------ Formatting Functions ------------------------ */

function ValueToInt(value)
{
	if(value && !isNaN(value)){return value;}
	else
	{
		//value = RemoveNonNumbers(value);
		value = (!value || isNaN(value)) ? 0 : parseInt(value);
		return 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 == "" || (typeof(source) != 'string' && typeof(source) != 'number')) { return ""; }
	else if(typeof(str).toLowerCase() == 'number'){return str;}
	
	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 GetCookie(c_name)
{
	var c = cookies[c_name];
	if (typeof (c) != "undefined")
	{
		return c;
	}
	return null;
}

function SetCookie(c_name, value, expiredays)
{
	var exdate = new Date();
	exdate.setDate(exdate.getDate() + expiredays);
	document.cookie = c_name + "=" + escape(value) +
	((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
}

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 Find(source, regEx)
{
	var re = new RegExp(regEx, "gm");
	var match = source.match(re);

	var value = "";

	if (match != null)
	{
		value = Trim(match.toString());
	}

	return value;
}

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 GetQueryParam(parameter, qs)
{
	qs = "&" + qs;
	var p = escape(unescape(parameter));
	var regex = new RegExp("[?&]" + p + "=(?:([^&]*))?", "i");

	var match = regex.exec(qs);
	var value = "";
	if (match != null)
	{
		value = match[1];
	}
	return value;
}

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 ValidateList(list, delimiter, type)
{
	if(type == typeof(1))
	{
		return ValidateNumberList(list, delimiter);
	}
	else if(type == typeof("string"))
	{

	}
}

function ValidateNumberList(list, delimiter)
{
	if(!Contains(list, delimiter))
	{
		return ValueToInt(list);
	}
	else
	{
		var items = Split(list, delimiter);
		if(items.length > 0)
		{
			return (items.length > 1)
				? items.join(delimiter)
				: ValueToInt(items[0]);
			;
		}
		return 0;
	}
}

function Split(str, delimiter)
{
	var rval = [];
	if(typeof(str) == typeof("string"))
	{
		if(Contains(str, delimiter))
		{
			rval = str.split(delimiter);
			for(var i = 0; i < rval.length; i++)
			{
				rval[i] = ValueToInt(rval[i]);
			}
		}
		else
		{
			rval = [ValueToInt(rval[i])];
		}
	}
	return rval;
}

function ValidObj(arg)
{
	if(arg == ""){ return false; }
	else if(arg == null){ return false; }
	else if(typeof(arg) == 'undefined'){ return false; }
	
	return true;
}

function ValidString(str)
{
	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; }
}

function ValidUSZipCode(str)
{
	return /(^\d{5}$)|(^\d{5}-\d{4}$)/.test(str);
}

function ValidEmail(str)
{
	return /^([\w]+)(\.[\w]+)*@([\w\-]+)(\.[\w]{2,7})(\.[a-z]{2})?$/i.test(str);
}

function isValidDate(date_string, format) 
{
	var days = [0,31,28,31,30,31,30,31,31,30,31,30,31];
	var year, month, day, date_parts = null;
	var rtrn = false;
	var decisionTree = {
		'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
		}
	};
	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;
	}
	
}//eof isValidDate

function isLeapYear() {
	return (year % 4 != 0 ? false : 
		( year % 100 != 0? true: 
		( year % 1000 != 0? false : true)));
}

function InputCount(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; 
}

/* ------------------------------ 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);
	}

}


