// JavaScript Document

function imgHover(obj) {
	var imgName = obj.src.split("/")[obj.src.split("/").length-1];
	
	if (imgName.split("_over").length == 1) {
		var imgNum = imgName.split(".")[0];
		obj.src = obj.src.replace(/.gif/, '_over.gif');
		//alert(obj.src);
		obj.onmouseout = function() {
			obj.src = obj.src.replace(/_over.gif/, '.gif');
		}
	}
}

function toggleHelp(num,button) {
	// Hide any other visible hint boxes
	var hints = getElementsByClassName("helpBubble", document.getElementById("content"));
	for (var i = 0; i < hints.length; i++) {
		hints[i].style.display = "none";	
	}
	
	var target = document.getElementById("help" + num);
	
	target.style.left = getLeft(button) + 12 + "px";
	target.style.top = getTop(button) + 12 + "px";

	if (target.style.display == "none") {
		showDiv("help" + num);
	} else {
		hideDiv("help" + num);
	}
}

function startQuotesRoll() {
	var frame = 1;  
    var nextframe = 2;  
    var last = 2;
	var interval = 12000;
	var dur = 3000;
	var start = 1;
	
	$('#testimonials1').fadeIn(dur);
	setInterval(function() {  
		$('#testimonials'+frame).fadeOut(dur, function() {
			$('#testimonials'+nextframe).fadeIn(dur);
			frame = nextframe;  
			nextframe = (frame == last) ? start : nextframe+1;  
		});
	},interval);
   
   	return;  
}

function addEvent(obj, evType, fn){ 
	if (obj.addEventListener){ 
		obj.addEventListener(evType, fn, false); 
		return true; 
	} else if (obj.attachEvent){ 
		var r = obj.attachEvent("on"+evType, fn); 
		return r; 
	} else { 
		return false; 
	} 
}

function getElementsByClassName(classname, node) {
	if(!node) node = document.getElementsByTagName("body")[0];
	
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');	
	var els = node.getElementsByTagName("*");

	for(var i=0,j=els.length; i<j; i++)
		if(re.test(els[i].className)) a.push(els[i]);
		
	return a;
}



function showDiv(id) {
	if (document.getElementById(id)) {
		document.getElementById(id).style.display = "";
	}
}

function hideDiv(id) {
	if (document.getElementById(id)) {
		document.getElementById(id).style.display = "none";
	}
}

function toggleDiv(id) {
	if (document.getElementById(id)) {
		var target = document.getElementById(id);
		
		if (target.style.display == "none") {
			showDiv(id);
		} else {
			hideDiv(id);
		}
	}
}

function getLeft(obj) {
	if ('string' == typeof obj)
		obj = document.getElementById(obj);
	var x = 0;
	while (obj != null) {
		x += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	return x;
}

function getTop(obj) {
	if ('string' == typeof obj)
		obj = document.getElementById(obj);
	var y = 0;
	while (obj != null) {
		y += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return y;
}

/******************************************************************
Date validation: mm/dd/yyyy
******************************************************************/
function is_valid_date(field_name, date_str)
{
	var err_str = '';
	var tsd = date_str.split('/');
	var year = 0;
	var month = 0;
	var day = 0;
	var days_in_feb = 0;
	var days_in_month = 0;
	if(tsd.length != 3 || isNaN(tsd[0]) || tsd[0] > 12 
		|| isNaN(tsd[1]) || tsd[1] > 31 || isNaN(tsd[2]))
	{
		err_str = '- '+field_name+' is invalid.\n\n';
	}
	else {
		month = tsd[0]*1;
		day = tsd[1]*1;
		year = tsd[2]*1;
		if(year < 2009 || year > 2100)
		{
			err_str = '- '+field_name+' is invalid\n\n';
			err_str += '    The year must be more than 2008 and less than 2101.';
			err_str += '\n\n';
		}
		else {
			days_in_feb=(((year%2==0)&&((!(year%100==0))||(year%400==0)))?29:28);
			if(month == 2)
			{
				days_in_month = days_in_feb;
			}
			else {
				if(month==4 || month==6 || month==9 || month==11)
				{
					days_in_month = 30;
				}
				else days_in_month = 31;
			}
			if(day > days_in_month)
			{
				err_str = '- '+field_name+' is invalid\n\n';
				err_str += '    The month '+month+'/'+year+' does not have ';
				err_str += day+' days.\n\n';
			}
		}
	}
	return err_str;
}

/******************************************************************
JS functions for use with onkeypress
******************************************************************/

function isAlphaKey(evt)
{
	if(evt.which || (typeof(event) != 'undefined'))
	{
		var charCode = (evt.which) ? evt.which : event.keyCode;
		if(charCode > 31 && (charCode < 65 || charCode > 90)
						 && (charCode < 97 || charCode > 122)
						 && charCode != 32) {
			return false;
		}
	}
	return true;
}//end of isAlphaKey

/*
The following function is derived from:
http://www.cambiaresearch.com/c4/029c978b-aac5-472e-97a8-95b256f5febd/How-Can-I-Use-Javascript-to-Allow-Only-Numbers-to-Be-Entered-in-a-TextBox.aspx
It has been slightly amended to avoid JS errors on tabbing.
*/
function isNumberKey(evt)
{
	var ctrlKey = false;
	if(evt && evt.ctrlKey) ctrlKey = evt.ctrlKey;
	else if(evt && evt.metaKey) ctrlKey = evt.metaKey;
	else if(typeof(event) != 'undefined')
	{
		if(event.ctrlKey) ctrlKey = event.ctrlKey;
		else if(event.metaKey) ctrlKey = event.metaKey;
	}
	if(evt.which || (typeof(event) != 'undefined'))
	{
		var charCode = (evt.which) ? evt.which : event.keyCode;
		if (!ctrlKey && charCode > 31 && (charCode < 48 || charCode > 57)) {
			return false;
		}
	}
	return true;
}	
function isNumberKeyorDash(evt)
{
	if(evt.which || (typeof(event) != 'undefined'))
	{
		var charCode = (evt.which) ? evt.which : event.keyCode;
		var ctrlKey = false;
		if(evt && evt.ctrlKey) ctrlKey = evt.ctrlKey;
		else if(evt && evt.metaKey) ctrlKey = evt.metaKey;
		else if(typeof(event) != 'undefined')
		{
			if(event.ctrlKey) ctrlKey = event.ctrlKey;
			else if(event.metaKey) ctrlKey = event.metaKey;
		}
		if (ctrlKey && (charCode == 86 || charCode == 118)) return true;
		else if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 45) return false;
	}
	return true;
}
function isPhoneKey(evt, obj)
{
	var cleaned = obj.value;
	var op = '(';
	var cp = ')';
	var da = '-';
	while(cleaned.indexOf(op) > -1) cleaned = cleaned.replace(op,'');
	while(cleaned.indexOf(cp) > -1) cleaned = cleaned.replace(cp,'');
	while(cleaned.indexOf(da) > -1) cleaned = cleaned.replace(da,'');
	var allow_op = (obj.value.length == 0);
	var allow_cp = (obj.value.length == 4 && obj.value.indexOf('(') == 0);
	var allow_da = ((obj.value.length == 8 && obj.value.indexOf('(') > -1) || (obj.value.indexOf('(')==-1 && (obj.value.length==3 || (obj.value.length == 7 && obj.value.indexOf('-') > -1))));
	if(evt.which || (typeof(event) != 'undefined'))
	{
		var charCode = (evt.which) ? evt.which : event.keyCode;
		if(charCode == 40 && allow_op) return true;
		else if(charCode == 41 && allow_cp) return true;
		else if(charCode == 45 && allow_da) return true;
		else if (charCode > 31 && (charCode < 48 || charCode > 57)) return false;
		else if(charCode >= 48 && charCode <= 57 && cleaned.length == 10)
		{
			return false;	
		}
	}
	return true;	
}
function isPeriod(evt)
{
	if(evt.which || (typeof(event) != 'undefined'))
	{
		var charCode = (evt.which) ? evt.which : event.keyCode;
		if (charCode != 46) return false;
	}
	return true;	
}

function isPrice(evt, price_str)
{
	var period = price_str.indexOf('.');
	var pl = price_str.length;
	if(period != -1 && period == (pl-3)) 
	{
		if(evt.which || (typeof(event) != 'undefined'))
		{
			var charCode = (evt.which) ? evt.which : event.keyCode;
			if (charCode > 31 && (charCode < 48 || charCode > 57)) {
				//alert(charCode);
				return false;
			}
		}
	}
	else if(period == -1) 
	{
		//numbers or period
		if(evt.which || (typeof(event) != 'undefined'))
		{
			var charCode = (evt.which) ? evt.which : event.keyCode;
			if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) return false;
		}	
	}
	else {
		//numbers
		if(evt.which || (typeof(event) != 'undefined'))
		{
			var charCode = (evt.which) ? evt.which : event.keyCode;
			if (charCode > 31 && (charCode < 48 || charCode > 57)) return false;
		}
	}
	return true;
}

function cleanPrice(el)
{
	var elv = el.value;
	var elvp = elv.split('.');
	if(elvp.length >= 2)
	{
		el.value = elvp[0]+'.'+elvp[1].substring(0,2);	
	}
}

function isForwardSlash(evt)
{
	if(evt.which || (typeof(event) != 'undefined'))
	{
		var charCode = (evt.which) ? evt.which : event.keyCode;
		if (charCode != 47) return false;
	}
	return true;	
}

/******************************************************************
JS string-checking functions
******************************************************************/

function hasNumbersAndLetters(str)
{
	var number_check = false;
	var letter_check = false;
	var c = 0;
	for(var sc=0; sc<str.length; sc++)
	{
		c = str.charCodeAt(sc);
		if(c >= 48 && c <= 57) number_check = true;
		else if(c >= 65 && c <= 90) letter_check = true;
		else if(c >= 97 && c <= 122) letter_check = true;
	}
	return(number_check && letter_check);
}

function is_valid_us_state(str)
{
	var states = Array();
	var found = false;
	str = str.toUpperCase();
	//the following states and possessions were pulled from:
	// -> http://www.usps.com/ncsc/lookups/usps_abbreviations.html
	states[states.length] = 'ALABAMA';				states[states.length] = 'AL';
	states[states.length] = 'ALASKA';				states[states.length] = 'AK';
	states[states.length] = 'AMERICAN SAMOA';		states[states.length] = 'AS';
	states[states.length] = 'ARIZONA';				states[states.length] = 'AZ';
	states[states.length] = 'ARKANSAS';				states[states.length] = 'AR';
	states[states.length] = 'CALIFORNIA';			states[states.length] = 'CA';
	states[states.length] = 'COLORADO';				states[states.length] = 'CO';
	states[states.length] = 'CONNECTICUT';			states[states.length] = 'CT';
	states[states.length] = 'DELAWARE';				states[states.length] = 'DE';
	states[states.length] = 'DISTRICT OF COLUMBIA';	states[states.length] = 'DC';
	states[states.length] = 'FEDERATED STATES OF MICRONESIA';
													states[states.length] = 'FM';
	states[states.length] = 'FLORIDA';				states[states.length] = 'FL';
	states[states.length] = 'GEORGIA';				states[states.length] = 'GA';
	states[states.length] = 'GUAM';					states[states.length] = 'GU';
	states[states.length] = 'HAWAII';				states[states.length] = 'HI';
	states[states.length] = 'IDAHO';				states[states.length] = 'ID';	
	states[states.length] = 'ILLINOIS';				states[states.length] = 'IL';
	states[states.length] = 'INDIANA';				states[states.length] = 'IN';
	states[states.length] = 'IOWA';					states[states.length] = 'IA';
	states[states.length] = 'KANSAS';				states[states.length] = 'KS';	
	states[states.length] = 'KENTUCKY';				states[states.length] = 'KY';
	states[states.length] = 'LOUISIANA';			states[states.length] = 'LA';
	states[states.length] = 'MAINE';				states[states.length] = 'ME';
	states[states.length] = 'MARSHALL ISLANDS';		states[states.length] = 'MH';
	states[states.length] = 'MARYLAND';				states[states.length] = 'MD';
	states[states.length] = 'MASSACHUSETTS';		states[states.length] = 'MA';
	states[states.length] = 'MICHIGAN';				states[states.length] = 'MI';
	states[states.length] = 'MINNESOTA';			states[states.length] = 'MN';
	states[states.length] = 'MISSISSIPPI';			states[states.length] = 'MS';
	states[states.length] = 'MISSOURI';				states[states.length] = 'MO';
	states[states.length] = 'MONTANA';				states[states.length] = 'MT';
	states[states.length] = 'NEBRASKA';				states[states.length] = 'NE';
	states[states.length] = 'NEVADA';				states[states.length] = 'NV';
	states[states.length] = 'NEW HAMPSHIRE';		states[states.length] = 'NH';
	states[states.length] = 'NEW JERSEY';			states[states.length] = 'NJ';
	states[states.length] = 'NEW MEXICO';			states[states.length] = 'NM';
	states[states.length] = 'NEW YORK';				states[states.length] = 'NY';
	states[states.length] = 'NORTH CAROLINA';		states[states.length] = 'NC';
	states[states.length] = 'NORTH DAKOTA';			states[states.length] = 'ND';
	states[states.length] = 'NORTHERN MARIANA ISLANDS';
													states[states.length] = 'MP';
	states[states.length] = 'OHIO';					states[states.length] = 'OH';
	states[states.length] = 'OKLAHOMA';				states[states.length] = 'OK';
	states[states.length] = 'OREGON';				states[states.length] = 'OR';
	states[states.length] = 'PALAU';				states[states.length] = 'PW';
	states[states.length] = 'PENNSYLVANIA';			states[states.length] = 'PA';
	states[states.length] = 'PUERTO RICO';			states[states.length] = 'PR';
	states[states.length] = 'RHODE ISLAND';			states[states.length] = 'RI';
	states[states.length] = 'SOUTH CAROLINA';		states[states.length] = 'SC';
	states[states.length] = 'SOUTH DAKOTA';			states[states.length] = 'SD';
	states[states.length] = 'TENNESSEE';			states[states.length] = 'TN';
	states[states.length] = 'TEXAS';				states[states.length] = 'TX';
	states[states.length] = 'UTAH';					states[states.length] = 'UT';
	states[states.length] = 'VERMONT';				states[states.length] = 'VT';
	states[states.length] = 'VIRGIN ISLANDS';		states[states.length] = 'VI';
	states[states.length] = 'VIRGINIA';				states[states.length] = 'VA';
	states[states.length] = 'WASHINGTON';			states[states.length] = 'WA';
	states[states.length] = 'WEST VIRGINIA';		states[states.length] = 'WV';
	states[states.length] = 'WISCONSIN';			states[states.length] = 'WI';
	states[states.length] = 'WYOMING';				states[states.length] = 'WY';
	for(var sc=0; sc<states.length; sc++)
	{
		if(states[sc] == str) found = true;
	}
	return found;
}
/*
The following function is derived from:
http://matthom.com/archive/2005/12/22/validating-credit-card-numbers-the-luhn-algorithm
It was incorrect however in some aspects; this revision has been amended.
*/
function luhn_check(card_number)
{
	var cc_array = card_number.split( "" );
	cc_array.reverse();
	var digit_string = "";	
	var current_digit = 0;
	for (var counter=0; counter < cc_array.length; counter++ )
	{
		current_digit = parseInt( cc_array[counter] );		
		if (counter %2 != 0) current_digit *= 2;		
		digit_string += current_digit;	
	}
	//alert(digit_string);
	var digit_sum = 0;	
	for (var counter=0; counter<digit_string.length; counter++ )
	{
		current_digit = parseInt( digit_string.charAt(counter) )
		digit_sum += current_digit;
	}	
	//alert(digit_sum);
	if ( digit_sum % 10 == 0 ) return true;
	else return false;
}

//a slightly altered version of code provided at 
//	http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/
function viewport_size()
{
	var viewportwidth;
 	var viewportheight;
	if (typeof window.innerWidth != 'undefined')
	{
		viewportwidth = window.innerWidth,
		viewportheight = window.innerHeight
	}
	else if (typeof document.documentElement != 'undefined'
		&& typeof document.documentElement.clientWidth != 'undefined' 
		&& document.documentElement.clientWidth != 0)
	{
		viewportwidth = document.documentElement.clientWidth,
		viewportheight = document.documentElement.clientHeight
	}
	else
	{
		viewportwidth = document.getElementsByTagName('body')[0].clientWidth,
		viewportheight = document.getElementsByTagName('body')[0].clientHeight
	}
	return Array(viewportwidth, viewportheight);
}
