/* note, place any new utility functions into "util" namespace (see bottom of this file) */

var msieversion = function()
{
	var ua = window.navigator.userAgent;
	var msie = ua.indexOf ( "MSIE " );

	if (msie > 0) // If Internet Explorer, return version number
		return parseInt(ua.substring (msie+5, ua.indexOf (".", msie )));
	else // If another browser, return 0
		return 0;
}

/* ============================================================================================== */

var newWindow = function(mypage,myname,w,h,features)
{
	if(screen.width)
	{
		var winl = (screen.width-w)/2;
		var wint = (screen.height-h)/2;
	}
	else
	{
		winl = 0;wint =0;
	}
	if (winl < 0) winl = 0;
	if (wint < 0) wint = 0;
	var settings = "height=" + h + ",";
	settings += "width=" + w + ",";
	settings += "top=" + wint + ",";
	settings += "left=" + winl + ",";
	settings += features;
	win = window.open(mypage,myname,settings);
	if (win && win.focus) win.focus();
}

/* ============================================================================================== */

var getAbsoluteCoords = function(element)
{
	var coords = {x: 0, y: 0};
	var el = element;
	do
	{
		coords.x += el.offsetLeft;
		coords.y += el.offsetTop;
	}
	while ((el = el.offsetParent) && el.style && el.style.position == "");
	return coords;
}

/* ============================================================================================== */

var getPageCoords = function(element)
{
	var coords = {x: 0, y: 0};
	var el = element;
	do
	{
		coords.x += el.offsetLeft;
		coords.y += el.offsetTop;
	}
	while ((el = el.offsetParent));
	return coords;
}

/* ============================================================================================== */

var getViewPortSize = function()
{
	var size = {width: 0, height: 0};
	if (window.innerWidth)
	{
		size.width = window.innerWidth - 18;
		size.height = window.innerHeight - 18;
	}
	else if (document.documentElement && document.documentElement.clientWidth)
	{
		size.width = document.documentElement.clientWidth;
		size.height = document.documentElement.clientHeight;
	}
	else if (document.body && document.body.clientWidth)
	{
		size.width = document.body.clientWidth;
		size.height = document.body.clientHeight;
	}
	return size;
}

/* ============================================================================================== */

var trim = function(str)
{
	return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}

/* ============================================================================================== */

var showCCSecCodeHelp = function(e)
{
	var html = "<div style='background-color:white'><table cellpadding='2' cellspacing='0' border='1'><tr>";
		html += "<td valign='top' style='font-family:verdana;font-size:10px;'><img src='/resources/common/images/180px-CVC2SampleVisaNew.png' border='0'><br>";
		html += "The Security Code is located on the back of MasterCard, Visa and Discover credit or debit cards and is typically a separate group of 3 digits to the right of the signature strip.</td>";
		html += "<td valign='top' style='font-family:verdana;font-size:10px;'><img src='/resources/common/images/180px-CIDSampleAmex.png' border='0'><br>";
		html += "On American Express cards, the Card Security Code is a printed (NOT embossed) group of four digits on the front towards the right.</td>";
		html += "</tr></table></div>";
	Tooltip.init();
	doTooltip(e, html);
}

/* ============================================================================================== */

var clearUndisplayedFields = function(form)
{
	var eles = form.elements;
	var ele;
	var vis;
	var eleTag;
	var eleType;
	var noclear;
	for (var i = 0; i < eles.length; i++)
	{
		ele = eles[i];
		vis = true;
		while (ele.tagName.toLowerCase() != "body")
		{
			if (ele.style.display === "none" || ele.style.visibility === 'hidden')
			{
				vis = false;
				break;
			}
			ele = ele.parentNode;
		}

		ele = eles[i];

		if (!vis)
		{
			noclear = ele.getAttribute("noclear");
			if (!noclear || noclear != "true")
			{
				eleTag = ele.tagName.toLowerCase();
				if (eleTag == "input")
				{
					eleType = ele.type.toLowerCase();
					if (eleType == "text" || eleType == "file" || eleType == "password")
					{
						ele.value = "";
					}
					else if (eleType == "checkbox" || eleType == "radio")
					{
						ele.checked = false;
					}
				}
				else if (eleTag == "textarea")
				{
					ele.value = "";
				}
				else if (eleTag == "select")
				{
					ele.selectedIndex = -1;
				}
			}
		}
	}
}

/* ============================================================================================== */

var addCommas = function(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1))
	{
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

/* ============================================================================================== */

var applyEmbeddedJS = function(htmlContent)
{
	var allJs = "";
	var s = "<" + "script[^>]*>([\\s\\S]+?)<" + "/script>";
	var re = new RegExp(s, "g");
	var matchResult = re.exec(htmlContent);
	while (matchResult != null)
	{
		allJs = allJs + RegExp.$1;
		matchResult = re.exec(htmlContent);
	}
	eval(allJs);
}

/* ============================================================================================== */

var applyEmbeddedCSS = function(htmlContent)
{
	var allCSS = "";
	var s = "<" + "style[^>]*>([\\s\\S]+?)<" + "/style>";
	var re = new RegExp(s, "g");
	var matchResult = re.exec(htmlContent);
	while (matchResult != null)
	{
		allCSS = allCSS + RegExp.$1;
		matchResult = re.exec(htmlContent);
	}
	if (allCSS.length > 0)
	{
		var styleEle = document.createElement("style");
		styleEle.setAttribute("type", "text/css");
		if(styleEle.styleSheet)
		{// IE
			styleEle.styleSheet.cssText = allCSS;
		}
		else
		{// w3c
			var cssText = document.createTextNode(allCSS);
			styleEle.appendChild(cssText);
		}
		document.getElementsByTagName("head")[0].appendChild(styleEle);
	}
}

/* ============================================================================================== */

var extractFormData = function(form)
{
	if (typeof(form) == "string") form = document.forms[form];
	var formData = new Object();
	var ele;
	for (var i = 0; i < form.elements.length; i++)
	{
		ele = form.elements[i];
		if (!formData[ele.name])
		{
			formData[ele.name] = "";
		}

		if (ele.type == "select-multiple" && ele.options && ele.options.length > 0)
		{
			for (var j = 0; j < ele.options.length; j++)
			{
				if (ele.options[j].selected)
				{
					if (formData[ele.name].length > 0 && ele.options[j].value.length > 0)
						formData[ele.name] = formData[ele.name] + ",";
					formData[ele.name] = formData[ele.name] + ele.options[j].value;
				}
			}
		}
		else if (ele.type == "checkbox" || ele.type == "radio")
		{
			if (ele.checked)
			{
				if (formData[ele.name].length > 0 && ele.value.length > 0)
					formData[ele.name] = formData[ele.name] + ",";
				formData[ele.name] = formData[ele.name] + ele.value;
			}
		}
		else
		{
			if (formData[ele.name].length > 0 && ele.value.length > 0)
				formData[ele.name] = formData[ele.name] + ",";
			formData[ele.name] = formData[ele.name] + ele.value;
		}
	}
	return formData;
}

/* ============================================================================================== */

var setFormFields = function(form, parms)
{
	if (typeof(form) == "string") form = document.forms[form];

	if (parms && typeof(parms) == "object")
	{
		var ele;
		for (var n in parms)
		{
			ele = form.elements[n];
			if (ele) ele.value = parms[n];
		}
	}
}

/* ============================================================================================== */

var getFormField = function(form, name)
{
	if (typeof(form) == "string") form = document.forms[form];
	return form.elements[name];
}

/* ============================================================================================== */

/**
	Returns the current time like "2:04:37 pm"
**/
var getCurrentTime = function()
{
	var currentTime = new Date();
	var hours = currentTime.getHours();
	var minutes = currentTime.getMinutes();
	var seconds = currentTime.getSeconds();
	if (hours > 11)
		ampm = "pm";
	else
		ampm = "am";
	if (hours > 12)
		hours = hours - 12;
	if (minutes < 10)
		minutes = "0" + minutes;
	if (seconds < 10)
		seconds = "0" + seconds;

	return hours + ":" + minutes + ":" + seconds + " " + ampm;
}

/* ============================================================================================== */

var scrollIntoView = function(element)
{
	var coords = getPageCoords(element);
	var viewPort = getViewPortSize();
	if (element.scrollHeight > viewPort.height || coords.y < document.body.scrollTop)
	{
		window.scrollTo(0, coords.y);
	}
	else if (((coords.y - document.body.scrollTop) + element.scrollHeight) > viewPort.height)
	{
		 var newy = coords.y - (viewPort.height - element.scrollHeight)
		 window.scrollTo(0, newy);
	}
}

/* ============================================================================================== */

var isValidEmail = function(email)
{
	var ok = true;

	email = email.replace(/ +/g, '');
	var re = /^[a-zA-Z0-9]+[a-zA-Z0-9_\&\%\~\+\$\.\-\']*@([a-zA-Z0-9_\.\-]+\.)+[a-zA-Z]{2,4}$/;
	if (!re.test(email))
	{
		ok = false;
	}
	else if (email.toLowerCase() == "gbrennan1613@aol.com"
				|| email.toLowerCase() == "gbrennan@aol.com"
				|| email.toLowerCase() == "chisamu2000@yahoo.com")
	{
		ok = false;
	}

	return ok;
}

/* ============================================================================================== */

var isValidPhone = function(phone)
{
	var ok = true;

	phone = phone.replace(/[^0-9]+/g, '');
	if (phone.length != 10)
	{
		ok = false;
	}
	else if (phone.substring(0,1) == "0" || phone.substring(0,1) == "1" || phone.substring(1,3) == "11" || phone.substring(3,6) == "555")
	{
		ok = false;
	}
	else if ("3522414528,6199999999,5019083036,7723700767".indexOf(phone) >= 0)
	{
		ok = false;
	}

	return ok;
}

/* ============================================================================================== */

var isNumeric = function(val)
{
	return ((val - 0) == val && ("" + val).length > 0);
}

/* ============================================================================================== */

var setCharsRemaining = function(fieldId, countId, limit)
{
	var field = document.getElementById(fieldId);
	var counter = document.getElementById(countId);
	if (field.value.length > limit)
	{
		field.value = field.value.substring(0, limit);
	}
	counter.innerHTML = limit - field.value.length;
}

/* ============================================================================================== */

/* Base64 conversion methods.
 * Copyright (c) 2006 by Ali Farhadi.
 * released under the terms of the Gnu Public License.
 * see the GPL for details.
 *
 * Email: ali[at]farhadi[dot]ir
 * Website: http://farhadi.ir/
 */

//Encodes data to Base64 format
var base64Encode = function(data)
{
	if (typeof(btoa) == 'function') return btoa(data);//use internal base64 functions if available (gecko only)
	var b64_map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
	var byte1, byte2, byte3;
	var ch1, ch2, ch3, ch4;
	var result = new Array(); //array is used instead of string because in most of browsers working with large arrays is faster than working with large strings
	var j=0;
	for (var i=0; i<data.length; i+=3) {
		byte1 = data.charCodeAt(i);
		byte2 = data.charCodeAt(i+1);
		byte3 = data.charCodeAt(i+2);
		ch1 = byte1 >> 2;
		ch2 = ((byte1 & 3) << 4) | (byte2 >> 4);
		ch3 = ((byte2 & 15) << 2) | (byte3 >> 6);
		ch4 = byte3 & 63;

		if (isNaN(byte2)) {
			ch3 = ch4 = 64;
		} else if (isNaN(byte3)) {
			ch4 = 64;
		}

		result[j++] = b64_map.charAt(ch1)+b64_map.charAt(ch2)+b64_map.charAt(ch3)+b64_map.charAt(ch4);
	}

	return result.join('');
}

/* ============================================================================================== */

//Decodes Base64 formated data
var base64Decode = function(data)
{
	data = data.replace(/[^a-z0-9\+\/=]/ig, '');// strip none base64 characters
	if (typeof(atob) == 'function') return atob(data);//use internal base64 functions if available (gecko only)
	var b64_map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
	var byte1, byte2, byte3;
	var ch1, ch2, ch3, ch4;
	var result = new Array(); //array is used instead of string because in most of browsers working with large arrays is faster than working with large strings
	var j=0;
	while ((data.length%4) != 0) {
		data += '=';
	}

	for (var i=0; i<data.length; i+=4) {
		ch1 = b64_map.indexOf(data.charAt(i));
		ch2 = b64_map.indexOf(data.charAt(i+1));
		ch3 = b64_map.indexOf(data.charAt(i+2));
		ch4 = b64_map.indexOf(data.charAt(i+3));

		byte1 = (ch1 << 2) | (ch2 >> 4);
		byte2 = ((ch2 & 15) << 4) | (ch3 >> 2);
		byte3 = ((ch3 & 3) << 6) | ch4;

		result[j++] = String.fromCharCode(byte1);
		if (ch3 != 64) result[j++] = String.fromCharCode(byte2);
		if (ch4 != 64) result[j++] = String.fromCharCode(byte3);
	}

	return result.join('');
}

/* ============================================================================================== */

var jsDump = function(o, maxLevel, currLevel)
{
	maxLevel = maxLevel || 1;
	currLevel = currLevel || 0;
	if (currLevel > maxLevel) return "Too deep";
	var ret = '';
	var memCnt = 0;

	if(typeof(o) != 'function')
		ret = typeof(o) + ': ';

	if(typeof(o) == 'object' && maxLevel > currLevel)
	{
		try
		{
			for(i in o)
			{
				memCnt++;
				if (memCnt == 1) ret+= '\r\n';
				try
				{
					ret += "  ".repeat(currLevel) + i + ' => ' + jsDump(o[i], maxLevel, currLevel+1) + '\r\n';
				}
				catch(e) {}
			}
			if (!memCnt) ret+= "(no members)"
		}
		catch(e)
		{
			ret = '(iterate failed)';
		}
	}
	else if(typeof(o) != 'undefined' && typeof(o) != 'object')
	{
		try
		{
			ret += o.toString().indent(currLevel, 1);
		}
		catch(e)
		{
			ret += '(toString failed)';
		}
	}
	return ret;
}

if(!String.prototype.repeat)
{
	String.prototype.repeat = function(n)
	{
		var s=this.toString(), ret='';
		while( (n--) > 0) ret+=s;
		return ret;
	}
}
if(!String.prototype.indent)
{
	String.prototype.indent = function(level, dontIndentFirst, indentChar)
	{
		indentChar = indentChar || "  ";
		dontIndentFirst = Number(dontIndentFirst)||0;
		var s = this.toString();
		s = s.split(/^/m);
		for(var i=dontIndentFirst, l=s.length; i<l; i++)
		s[i] = indentChar.repeat(level) + s[i];
		return s.join("");
	}
}


// Please namespace new functions into "util" namespace
var util = (function() {
	// "private functions
	function $(id)
	{
		return document.getElementById(id);
	}

	return {
		/**
		 * given the id of a table, change the class name of every other
		 * row (only within tbodies inside the table
		 * to the specified class name, or "ass-TableRowAlt" if none specified.
		 */
		
		stripeTable: function(tableId, altClass) {
			var tbl = $(tableId), tbods, trs, i=0, j, x=0, y, alt=false;

			if (!tbl) {
				return;
			}
			
			if (!altClass)
			{
				altClass = "ass-TableRowAlt";
			}
				
			tbods = tbl.getElementsByTagName("tbody");

	    for (j=tbods.length; i<j; i++)
	    {
	      trs = tbods[i].getElementsByTagName("tr");
	      
	      for (y=trs.length; x < y; x++)
	      {
	      	if (alt)
	      	{
	      		trs[x].className = altClass;
	      	}
	      	alt=!alt;
	      }
	    }
		}
	
		// define additional functions for util namespace here
	
	};

}) ();