//*---------------------------------------------------
// ONLOAD
//--------------------------------------------------*/
 
/* Simon Willison's addLoadEvent function allows you to stack up 'window.onload' events 
without them stepping on each other's toes. 
It's explained here - http://www.sitepoint.com/blog-post-view.php?id=171578 */

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}


/* new accessible, unobtrusive popup code */

function windowLinks() {                      // create a new function called windowLink(); 
    if(!document.getElementsByTagName) {      // Only run the function on browsers that
         return;                              // understand 'getElementsByTagName' - new browsers
    }
	
    var anchors = document.getElementsByTagName("a"); // grab all links and pop them in an array called 'anchors'
    for (var i = 0; i < anchors.length; i++) {        // start a loop to work our way through 
         var anchor = anchors[i];                     // grab the next link & copy it to 'anchor' for working
         var classIndex = anchor.className;                   // get the value of it's 'class' attribute
		 if (classIndex) {                               // does it have a value for class?...
			if (classIndex == "lock") {
				anchor.title = "Launch a secure web page.";
			} else if (classIndex == "pdf") {
				anchor.title = "Launch an Adobe Acrobat PDF document.";
			} else if (classIndex == "popupteco") {
				anchor.title = "Launch a TECO Energy website in a new window.";
			} else if (classIndex == "popup") {
				anchor.title = "Launch a new window.";
			}
		}
	  }
} 

addLoadEvent(function() {
	windowLinks();	// run our new function as soon as the page loads. 
});




//*---------------------------------------------------
// MISC
//--------------------------------------------------*/
// Submits a form when dropdown changed
function dropSubmit(object) {
	if (object.value != "")
		object.form.submit();
}

//*---------------------------------------------------
// TOGGLES VISIBILITY
// INPUTS: object, vis, dis
//--------------------------------------------------*/

function toggle(object, vis, dis) {
  if (document.getElementById) {
	  document.getElementById(object).style.visibility = vis;
	  document.getElementById(object).style.display = dis;
  }

  else if (document.layers && document.layers[object] != null) {
	  document.layers[object].visibility = vis; 
	  document.layers[object].display = dis;
  }

  else if (document.all) {
	  document.all[object].style.visibility = vis;
	  document.all[object].style.display = dis;
  }

  return false;
}


// Toggles a div if atleast one radio or checkbox is checked
function showDivIfChecked (list, div) {
	var checked = false;
	for (var i=0, n=list.length; i<n; i++) {
		if (list[i].checked) {
			checked = true;
			break;
		}
	}
	if (checked) {
		toggle(div,'visible','block');
	} else {
		toggle(div,'hidden','none');
	}
}



//*---------------------------------------------------
// ROLLOVERS
//--------------------------------------------------*/

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}



//*---------------------------------------------------
// TEXTAREA COUNTER
//--------------------------------------------------*/
function textCountDown (field, maxCount, targetDiv) {
	var countdown = maxCount - field.value.length;
	var target;
	if (document.getElementById) {
		target = document.getElementById(targetDiv);
	} else if (document.layers && document.layers[targetDiv] != null) {
		target = document.layers[targetDiv];
	} else if (document.all) {
		target = document.all[targetDiv];
	}
	if (field.value.length > maxCount) {
		field.value = field.value.substring(0, maxCount);
	} else {
		target.innerHTML = '(' + countdown + ' characters left)';
	}
}


//*---------------------------------------------------
// VALIDATION
//--------------------------------------------------*/

// Checks if a field is empty, alerts a message and focuses on the control
function isEmpty (field, msg) {
	if (field.value == '') {
		// Alert and focus if a message is defined
		if (msg != undefined) {
			alert(msg);
			field.focus();
		}
		return true;
	} else {
		return false;
	}
}

// Compares two field strings
function isEqual (InString1, InString2, msg) {
	if (InString1.value != InString2.value) {
		// Alert and focus if a message is defined
		if (msg != undefined) {
			alert(msg);
			InString1.focus();
		}
		return false;
	} else {
		return true;
	}
}

// Checks if a field is an email address, alerts a message and focuses on the control
function isEmail (field, msg) {
	var txt = field.value;
	var AtSym  = txt.indexOf('@');
	var Period = txt.lastIndexOf('.');
	var Space  = txt.indexOf(' ');
	var Length = txt.length - 1;				// Array is from 0 to length-1
	
	if ((txt.length == 0) ||				// Empty
		(AtSym < 1) ||						// '@' cannot be in first position
		(Period <= AtSym+1) ||				// Must be atleast one valid char btwn '@' and '.'
		(Period == Length ) ||				// Must be atleast one valid char after '.'
		(Space  != -1))						// No empty spaces permitted
		{
			// Alert and focus if a message is defined
			if (msg != undefined) {
				if (msg == 'default') {
					alert("Please enter a valid E-mail Address.");
				} else {
					alert(msg);
				}
				field.focus();
			}
			return false;
	}

	return true;
}

// Verifies complete phone number
function isPhone (phoneArea, phonePre, phoneSub, msg) {
	if (!mask(phoneArea.value,"###") || !mask(phonePre.value,"###") || !mask(phoneSub.value,"####")) {
		// Alert and focus if a message is defined
		if (msg != undefined) {
			alert(msg);
			phoneArea.focus();
		}
		return false;
	} else {
		return true;
	}
}

// mask() takes two parameters -- an input string and a mask string.  The function loops through each character of the mask string, then compares the same position char of the input against the mask (e.g., takes the 1st char of the mask and compares 1st char of input; 2nd char of mask, 2nd char of input; etc...) This forces the phone numbers to 3 and 4 digits, only allowing numbers to be used.
function mask (InString, Mask) {
	LenStr = InString.length;
	LenMsk = Mask.length;
	if ((LenStr==0) || (LenMsk==0))
		return(0);
	if (LenStr!=LenMsk)
		return(0);
	TempString = "";
	for (Count=0; Count<=InString.length; Count++) {
		StrChar = InString.substring(Count, Count+1);
		MskChar = Mask.substring(Count, Count+1);
		if (MskChar=='#') {
			if (!isNumber(StrChar))
				return(0);
		} else if (MskChar=='?') {
			if (!isAlphabeticChar(StrChar))
				return(0);
		} else if (MskChar=='!') {
			if (!isNumOrChar(StrChar))
				return(0);
		} else if (MskChar=='*') {
		} else {
			if (MskChar!=StrChar) 
				return(0);
		}
	}
	return (1);
}

// isAlphabeticChar() checks a single character to see if it is alpha.
function isAlphabeticChar (fieldOrStr, msg) {
	if (fieldOrStr.length != undefined) {
		InString = fieldOrStr;
	} else {
		InString = fieldOrStr.value;
	}
	var valid = true;
	if (InString.length != 1)
		valid = false;
	InString = InString.toLowerCase();
	RefString = "abcdefghijklmnopqrstuvwxyz";
	if (RefString.indexOf(InString.toLowerCase(), 0) == -1) 
		valid = false;
	// Alert and focus if a message is defined
	if (!valid && (msg != undefined)) {
		alert(msg);
		fieldOrStr.focus();
	}
	return valid;
}

// isNumber()
function isNumber (fieldOrStr, msg) {
	if (fieldOrStr.length != undefined) {
		InString = fieldOrStr;
	} else {
		InString = fieldOrStr.value;
	}
	if (parseInt(InString,10) != InString) {
		if (msg != undefined) {
			alert(msg);
			fieldOrStr.focus();
		}
		return false;
	}
	return true;
}

// isNumOrChar()
function isNumOrChar (fieldOrStr, msg) {
	if (fieldOrStr.length != undefined) {
		InString = fieldOrStr;
	} else {
		InString = fieldOrStr.value;
	}
	var valid = true;
	if (InString.length != 1) 
		valid = false;
	RefString = "1234567890abcdefghijklmnopqrstuvwxyz";
	if (RefString.indexOf(InString.toLowerCase(), 0) == -1) 
		valid = false;
	// Alert and focus if a message is defined
	if (!valid && (msg != undefined)) {
		alert(msg);
		fieldOrStr.focus();
	}
	return valid;
}

// Verify decimal
function isDecimal (fieldOrStr, msg) {
	if (fieldOrStr.length != undefined) {
		InString = fieldOrStr;
	} else {
		InString = fieldOrStr.value;
	}
//    if (InString.substring(0,1) == "0") {
//		InString = InString.substring(1,InString.length);
//	}
	if (("" + parseFloat(InString)) != InString) {
		if (msg != undefined) {
			alert(msg);
			fieldOrStr.focus();
		}
		return false;
	}
	return true;
}

// Verify Social Security Number
function isSSN (ssNo, msg) {
	if (!mask(ssNo.value,"###-##-####") && !mask(ssNo.value,"###-###-###")) {
		if (msg != undefined) {
			if (msg == 'default') {
				alert("Please enter your Social Security number in the format 999-99-9999 (US) or 999-999-999 (Can).");
			} else {
				alert(msg);
			}
			ssNo.focus();
		}
		return false;
	} else {
		return true;		 
	}
}

// Verify Social Security Number last three or four digits
function isSmSSN (ssNo, msg) {
	if (!mask(ssNo.value,"####") && !mask(ssNo.value,"###")) {
		if (msg != undefined) {
			if (msg == 'default') {
				alert("Please enter your the last part of your Social Security number in the format 9999 (US) or 999 (Can).");
			} else {
				alert(msg);
			}
			ssNo.focus();
		}
		return false;
	} else {
		return true;		 
	}
}

// Verify Federal Tax ID
function isTaxID (taxID, msg) {
	if (!mask(taxID.value,"##-#######")) {
		if (msg != undefined) {
			if (msg == 'default') {
				alert("Please enter your taxpayer ID in the format 99-9999999.");
			} else {
				alert(msg);
			}
			taxID.focus();
		}
		return false;
	} else {
		return true;		 
	}
}

// Checks for either Social Security Number or Federal Tax ID formatting
function isTaxIDOrSSN (taxID, msg) {
	if (!mask(taxID.value,"##-#######") && !mask(taxID.value,"###-##-####") && !mask(taxID.value,"###-###-###")) {
		if (msg != undefined) {
			if (msg == 'default') {
				alert("Please enter your Tax payer ID in the format 99-9999999 or your Social Security number in the format 999-99-9999 (US) or 999-999-999 (Can).");
			} else {
				alert(msg);
			}
			taxID.focus();
		}
		return false;
	} else {
		return true;		 
	}
}

// Checks for zipcode
function isZip(zipCode, msg) {
	if (!mask(zipCode.value,"#####") && !mask(zipCode.value,"#####-####") && !mask(zipCode.value,"?#?#?#")) {
		if (msg != undefined) {
			if (msg == 'default') {
				alert("Please enter the zip code in the format 99999 or 99999-9999 (US) or A9A9A9 (Can).");
			} else {
				alert(msg);
			}
			zipCode.focus();
		}
		return false;
	} else {
		return true;		 
	}
}

// Verifies radio or checkbox set has at least one item checked
function isChecked (list, msg) {
	var checked = false;
	for (var i=0, n=list.length; i<n; i++) {
		if (list[i].checked) {
			checked = true;
			break;
		}
	}
	// Alert and focus if a message is defined
	if (!checked && (msg != undefined)) {
		alert(msg);
		list[0].focus();
	}
	return checked;
}

// Verifies dropdown menu has at least one item selected
function isSelected (list, msg) {
	var selected = false;
	if ((list.selectedIndex != 0) || (list.value != '')) {
		selected = true;
	}
	// Alert and focus if a message is defined
	if (!selected && (msg != undefined)) {
		alert(msg);
		list.focus();
	}
	return selected;
}

// Validates mm/dd/yy and mm/dd/yyyy dates
function isDate (datefield, msg) {
	if (!dateCheck(datefield.value)) {
		if (msg != '') {
			alert(msg);
			datefield.focus();
		}
		return false
	}
	return true;
}
function dateCheck (dateval) {
	// Valid date check
	if (isNaN(new Date(dateval).getYear()))
		return (0);

	// Length check
	if ((dateval.length != 8) && (dateval.length != 10))
		return (0);

	// Formatting check
	a = dateval;
	
	slash1=a.indexOf("/");

	if ((slash1 == 0) || (slash1 == -1))
		return (0);

	d1 = slash1 + 1;
	
	slash2=a.indexOf("/", d1);
	
	if (slash2 == -1)
		return (0);
		
	y1 = slash2 + 1
	
	mm = a.substring(0, slash1)// month
	dd = a.substring(d1, slash2)// day
	if (dateval.length == 10) {
		yy = a.substr(y1+2, 2)// year
	} else {
		yy = a.substr(y1, 2)// year
	}
	
	if (yy.length != 2)
		return (0);

	//basic error checking
	if (mm<1 || mm>12 || isNaN(mm)) return (0);
	if (dd<1 || dd>31 || isNaN(dd)) return (0);
	if (yy<0 || yy>99 || isNaN(yy)) return (0);
	
	//advanced error checking

	// months with 30 days
	if (mm==4 || mm==6 || mm==9 || mm==11)
		{
		if (dd==31) return (0);
			}

	// february, leap year
	if (mm==2)
		{
		// feb
		var g=parseInt(yy/4,10)
		if (isNaN(g)) 
			{
			return (0);
			}

		if (dd>29) return (0);
		if (dd==29 && ((yy/4)!=parseInt(yy/4,10))) return (0);
		}

	return true;
}

// Validates mm/dd/yy date difference with today against maximum date span
function isWithinDateSpan (fieldOrStr, span, msg) {
	if (fieldOrStr.length != undefined) {
		InString = fieldOrStr;
	} else {
		InString = fieldOrStr.value;
	}
	if (!dateCheck(InString)) {
		return false
	}
	a = InString;
	slash1 = a.indexOf("/");
	d1 = slash1 + 1;
	slash2 = a.indexOf("/", d1);
	y1 = slash2 + 1
	mm = parseInt(a.substring(0, slash1),10) -1
	dd = a.substring(d1, slash2)
	//yy = 20 + a.substr(y1, 2)
	
	if (a.length === 10) {
		yy = a.substr(y1+2, 2)// last two digits of year
	} else {
		yy = a.substr(y1, 2)// year
	}
	yy = 20 + yy;

	Today = new Date();
	msTodayPlus = Today.getTime() + (span * 24 * 60 * 60 * 1000)
	CompareDate = new Date(yy,mm,dd);
	msCompareDate = CompareDate.getTime();
	msDiff = msTodayPlus - msCompareDate
	//console.log(msDiff)
	if (msDiff < 0) {
		if (msg != undefined) {
			alert(msg);
			if (fieldOrStr.length == undefined) {
				fieldOrStr.focus();
			}
		}
		return false;
	}
	return true;
}

// Validates mm/dd/yy date difference with today against minimum date span
function isOutsideDateSpan (fieldOrStr, span, msg) {
	if (fieldOrStr.length != undefined) {
		InString = fieldOrStr;
	} else {
		InString = fieldOrStr.value;
	}
	if (!dateCheck(InString)) {
		return false
	}
	a = InString;
	slash1 = a.indexOf("/");
	d1 = slash1 + 1;
	slash2 = a.indexOf("/", d1);
	y1 = slash2 + 1
	mm = parseInt(a.substring(0, slash1),10)-1
	dd = a.substring(d1, slash2)
	//yy = 20 + a.substr(y1, 2)	

	if (a.length === 10) {
		yy = a.substr(y1+2, 2)// last two digits of year
	} else {
		yy = a.substr(y1, 2)// year
	}
	yy = 20 + yy;

	Today = new Date();
	msTodayPlus = Today.getTime() + (span * 24 * 60 * 60 * 1000)
	CompareDate = new Date(yy,mm,dd);
	msCompareDate = CompareDate.getTime();
	msDiff = msCompareDate - msTodayPlus;
	if (msDiff < 0) {
		if (msg != undefined) {
			alert(msg);
			if (fieldOrStr.length == undefined) {
				fieldOrStr.focus();
			}
		}
		return false;
	}
	return true;
}




function calcWorkDays(startDate, endDate) { 
	var stDate = new Date(startDate); 
	//alert(stDate);
	var enDate = new Date(endDate); 
	//alert(enDate);
	var startDateYear 	= stDate.getFullYear(); 
	if (startDateYear < 2000) {
		startDateYear = startDateYear + 100;
	}
	var startDateMonth 	= stDate.getMonth(); 
	var startDateDat 	= stDate.getDate(); 
	var endDateYear 	= enDate.getFullYear(); 
	if (endDateYear < 2000) {
		endDateYear = endDateYear + 100;
	}
	var endDateMonth 	= enDate.getMonth(); 
	var endDateDat 		= enDate.getDate(); 

	ssDate = new Date(startDateYear, startDateMonth, startDateDat); 
	eeDate = new Date(endDateYear, endDateMonth, endDateDat);
	//alert(ssDate);
	//alert(eeDate);
	
	if (ssDate > eeDate) { 
		return -1; 
	} 
	
	workingdays = 0; 
	while (ssDate <= eeDate) { 
		if(ssDate.getDay() != 0 && ssDate.getDay() != 6) { 
			workingdays++; 
		} 
		ssDate = new Date(ssDate.valueOf() + 86400000); 
	} 
	return workingdays; 
}




// Verifies proper TEC meter number
//7/28/2008 TFDJD: note that this function has been modified to take 1 optional parameter (errMsg)
function isMeterNum(meterNo, errMsg) {
	var errorMsg 	= errMsg || "Please enter the meter number in the format '999999' or 'A12345'.";
	if (!mask(meterNo.value,"!#####")) {
		alert(errorMsg);
		meterNo.focus();
		return false;
	} else {
		return true;		 
	}
}

// Verifies proper TEC account number
//7/28/2008 TFDJD: note that this function has been modified to take 2 optional parameters (fldObj, errMsg)
function isTECAcctNum(InTECAcctNo, fldObj, errMsg) {
	var AcctNo		= "";
	var fieldObj	= fldObj || false;
	var errorMsg 	= errMsg || "The Tampa Electric account number you have entered is incorrect.";

	for(x = 0; x < InTECAcctNo.length; x++)
	{
		if (InTECAcctNo.charAt(x)=="1" ||
		    InTECAcctNo.charAt(x)=="2" ||
			InTECAcctNo.charAt(x)=="3" ||
			InTECAcctNo.charAt(x)=="4" ||
			InTECAcctNo.charAt(x)=="5" ||
			InTECAcctNo.charAt(x)=="6" ||
			InTECAcctNo.charAt(x)=="7" ||
			InTECAcctNo.charAt(x)=="8" ||
			InTECAcctNo.charAt(x)=="9" ||
			InTECAcctNo.charAt(x)=="0" ||
			InTECAcctNo.charAt(x)==" " ||
			InTECAcctNo.charAt(x)=="-")
		{
			if (InTECAcctNo.charAt(x) != " " &&
			    InTECAcctNo.charAt(x) != "-")
			{
				AcctNo = AcctNo + InTECAcctNo.charAt(x);
			}
		}
		else
		{
			alert(errorMsg);
			if (fieldObj != false) fldObj.focus();
			return false;
		}
	}
	
	if (AcctNo.length == 11)
	{
		if (AcctNo.substring(0,2) >= "01" && AcctNo.substring(0,2) <= 21)
		{
			if (AcctNo.substring(2,4) == "00" ||
				AcctNo.substring(2,4) == "01" ||
				AcctNo.substring(2,4) == "11" ||
				AcctNo.substring(2,4) == "12" ||
				AcctNo.substring(2,4) == "13" ||
				AcctNo.substring(2,4) == "16" ||
				AcctNo.substring(2,4) == "17" ||
				AcctNo.substring(2,4) == "20" ||
				AcctNo.substring(2,4) == "21" ||
				AcctNo.substring(2,4) == "25" ||
				AcctNo.substring(2,4) == "28" ||
				AcctNo.substring(2,4) == "30" ||
				AcctNo.substring(2,4) == "35" ||
				AcctNo.substring(2,4) == "37" ||
				AcctNo.substring(2,4) == "51" ||
				AcctNo.substring(2,4) == "61" ||
				AcctNo.substring(2,4) == "76" ||
				AcctNo.substring(2,4) == "77" ||
				AcctNo.substring(2,4) == "81" ||
				AcctNo.substring(2,4) == "82" ||
				AcctNo.substring(2,4) == "90" ||
				AcctNo.substring(2,4) == "91" ||
				AcctNo.substring(2,4) == "98")
			{
				MultByString = "432765432";
				ChecksumValue = 0;
				for(x = 0; x < 9; x++)
				{
					ChecksumValue = ChecksumValue + (MultByString.charAt(x) * AcctNo.charAt(x));
				}
				if (ChecksumValue % 11 == 0 ||
					ChecksumValue % 11 == 1)
				{
					CheckDigit = ChecksumValue % 11
				}
				else
				{
				CheckDigit = 11 - (ChecksumValue % 11)
				}
				if (AcctNo.charAt(9) != CheckDigit)
				{
					alert(errorMsg);
					if (fieldObj != false) fldObj.focus();
					return false;
				}
			}
			else
			{
				alert(errorMsg);
				if (fieldObj != false) fldObj.focus();
				return false;
			}
		}
		else
		{
			alert(errorMsg);
			if (fieldObj != false) fldObj.focus();
			return false;
		}
	}
	else
	{
		alert(errorMsg);
		if (fieldObj != false) fldObj.focus();
		return false;
	}

	return true;
}

// Verifies proper ABA number
function isAbaNum(InABANo) {
	for(x = 0; x < InABANo.length; x++) {
		if (InABANo.charAt(x)=="1" ||
			InABANo.charAt(x)=="2" ||
			InABANo.charAt(x)=="3" ||
			InABANo.charAt(x)=="4" ||
			InABANo.charAt(x)=="5" ||
			InABANo.charAt(x)=="6" ||
			InABANo.charAt(x)=="7" ||
			InABANo.charAt(x)=="8" ||
			InABANo.charAt(x)=="9" ||
			InABANo.charAt(x)=="0" )
		{
		} else {
			return false;
		}
	}
	
	if (InABANo.length != 9) {
		return false;
	}
	
	if (InABANo.charAt(0) != "0" &&
		InABANo.charAt(0) != "1" &&
		InABANo.charAt(0) != "2" &&
		InABANo.charAt(0) != "3") {
		return false;
	}
	
	return true;
}

// Prompts user to confirm their email address
function emailPrompt(email) { 
	if (!confirm("The e-mail address that you have entered is " + email.value  + "\nPlease check it for accuracy as we will be unable to complete your request if it is incorrect.\n\nClick the 'OK' button if the e-mail address is correct or use the 'Cancel' button to return to the form and make a correction.")) {
		email.focus();
		return false;
	}
	return true;
}

// trims leading or trailing spaces
function trim(str) { 
	str = str.replace(/^\s*/, '').replace(/\s*$/, ''); 
	return str;
}

/*
formatDollar() takes numerical input and formats it to have exactly two decimal places by adding trailing zeroes, if necessary (e.g., $3.5 this will be $3.50)
*/
function formatDollar (Val, DollarSign)  {
	Val=""+Val;
	if (Val.indexOf (".", 0)!=-1) {
		Dollars = Val.substring(0, Val.indexOf (".", 0));
		Cents = Val.substring(Val.indexOf (".", 0)+1, Val.indexOf (".", 0)+3);
		if (Cents.length==0) 
			Cents="00";
		if (Cents.length==1)
			Cents=Cents+"0";
	} else {
		Dollars = Val;
		Cents = "00";
	}

	if (DollarSign)
		return ("$"+Dollars+"."+Cents);
	else
		return (Dollars+"."+Cents);

}


/*
takes a form object (or a value) and determines if the pattern of the string matches a given pattern;
predefined regular expression are for AC License # and Contractor/Builder License #
*/
function isLicenseNbr(type, fieldOrStr, msg) {
	var re 			= (type.toLowerCase() == "ac") ? /^(([c|r][a|m])|cg)([a-z0-9])+$/i : /^(([c|r][g|b])|cr|r{2})([A-Za-z0-9]){2}([A-Za-z0-9]){0,8}$/i;
	var defaultMsg	= (type.toLowerCase() == "ac") ? "AC License # must begin with the letters CA, CG, CM, RA or RM, followed by a group of letters or numbers." : "Builder/Contractor License # must begin with CB, CG, CR, RB, RG or RR, followed by a group of letters or numbers.";		
	var valid		= true;
	var inString	= "";
	
	if (fieldOrStr.length != undefined) {
		InString = fieldOrStr;
	} else {
		InString = fieldOrStr.value;
	}
	
	valid = isRegExMatch(re, fieldOrStr)
	
	if (!valid && msg != undefined) {
		if (msg == 'default') {	
			alert(defaultMsg);
		}
		else {
			alert(msg)
		}
		fieldOrStr.focus();
	}
	return valid;
}

/*
takes a reqular expression, tests if the pattern matches fieldOrStr value and optionally displays a message
*/ 
function isRegExMatch (re, fieldOrStr, msg) {
	var valid 		= true;
	var InString 	=  '';
	
	if (fieldOrStr.length != undefined) {
		InString = fieldOrStr;
	} else {
		InString = fieldOrStr.value;
	}
	
	valid = re.test(InString);
	
	// Alert and focus if a message is defined
	if (!valid && (msg != undefined)) {
		if (msg == 'default') {
			alert('Please enter the value in the proper format.');
		} else {
			alert(msg);
		}
		fieldOrStr.focus();
	}
	return valid;
}

/*
compares two numbers; number to compare is passed explicitly, while other values
can be passed in explicitly or via form field reference; optionally shows error 
message and/or sets focus
*/
function isNbrGr8rThan (compare2, fieldOrNbr, msg, focusFld) {
	var valid 	= true;
	var nbr		= new Number();

	if (typeof(fieldOrNbr) == 'number') {
		nbr = fieldOrNbr;
	} else {
		nbr = parseFloat(fieldOrNbr.value);
	}

	if (nbr.toString() == 'NaN' || nbr < compare2) {
		valid = false;
	}
	
	// Alert and focus if a message is defined
	if (!valid && (msg != undefined)) {
		if (msg == 'default') {
			alert('The value ' + nbr + 'is less than the required value of ' + compare2 + '.');
		} else {
			alert(msg);
		}
		//set focus if the fieldOrNbr argument is not a number and an explicit
		//field name is not specified (assume it is a form field)
		if (typeof(fieldOrNbr) != 'number' && focusFld == undefined) {
			fieldOrNbr.focus();
		}
		else if (focusFld != undefined) {
			focusFld.focus();
		}
	}
	return valid;
} 


/*
compares two numbers; number to compare is passed explicitly, while other values
can be passed in explicitly or via form field reference; optionally shows error 
message and/or sets focus
*/
function isNbrLessThan (compare2, fieldOrNbr, msg, focusFld) {
	var valid 	= true;
	var nbr		= new Number();

	if (typeof(fieldOrNbr) == 'number') {
		nbr = fieldOrNbr;
	} else {
		nbr = parseFloat(fieldOrNbr.value);
	}

	if (nbr.toString() == 'NaN' || nbr > compare2) {
		valid = false;
	}
	
	// Alert and focus if a message is defined
	if (!valid && (msg != undefined)) {
		if (msg == 'default') {
			alert('The value ' + nbr + 'is greater than the maximum value of ' + compare2 + '.');
		} else {
			alert(msg);
		}
		//set focus if the fieldOrNbr argument is not a number and an explicit
		//field name is not specified (assume it is a form field)
		if (typeof(fieldOrNbr) != 'number' && focusFld == undefined) {
			fieldOrNbr.focus();
		}
		else if (focusFld != undefined) {
			focusFld.focus();
		}
	}
	return valid;
}



/*
checks to see if a number falls within a specified range; range is passed explicitly, 
while other values can be passed in explicitly or via form field reference; optionally 
shows error message and/or sets focus
*/
function isNbrInRange (lowRange, highRange, fieldOrNbr, msg, focusFld) {
	var valid 	= true;
	var nbr		= new Number();

	if (typeof(fieldOrNbr) == 'number') {
		nbr = fieldOrNbr;
	} else {
		nbr = parseFloat(fieldOrNbr.value);
	}

	if (nbr.toString() == 'NaN' || nbr < lowRange || nbr > highRange) {
		valid = false;
	}
	
	// Alert and focus if a message is defined
	if (!valid && (msg != undefined)) {
		if (msg == 'default') {
			alert('The value ' + nbr + 'does not fall within the required range of ' + lowRange + '-' + highRange + '.');
		} else {
			alert(msg);
		}
		//set focus if the fieldOrNbr argument is not a number and an explicit
		//field name is not specified (assume it is a form field)
		if (typeof(fieldOrNbr) != 'number' && focusFld == undefined) {
			fieldOrNbr.focus();
		}
		else if (focusFld != undefined) {
			focusFld.focus();
		}
	}
	return valid;
}



//used for check boxes that show comment fields when checked
function showHide(frmObj, chkd, el) {
	if (chkd) {
		toggle(el + 'Container', "visible", "block");
		//alert(frmObj[el].value)
		frmObj[el].focus();
	}
	else {
		toggle(el + 'Container', "hidden", "none");
	}
}



//restricts entry of filed value to only numbers, has option to allow "." to be entered
function nbrsOnly(e, allowDot, noShowAlert) {
	//alert(kc)
	//var e = window.event;
	//kc = event.keyCode
	e 			=  e || window.event ;    
	var kc 		=  e.which || e.keyCode;
	var isOK	= false;
	//alert(kc);
	switch (kc) {
		//required for non-ie browsers
		case 8 ://backspace
		case 9 ://tab
		case 35 ://end
		case 36 ://home
		case 37 ://<--
		case 39 ://--> || '
		//
		case 46 ://.||delete
		case 48 ://0
		case 49 ://1
		case 50 ://2
		case 51 ://3
		case 52 ://4
		case 53 ://5
		case 54 ://6
		case 55 ://7
		case 56 ://8
		case 57 ://9
			isOK = (kc == 46 && !arguments[1]) ? false : true;
			break;
		default :
			isOK = false;
			break;
	}
	if (!isOK && !arguments[2]) alert("Please enter only numbers 0-9.");
	return isOK;
}


//formats a number to include commas
function addCommas(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; 
} 


/*
sets the focus on another form field when a value (of an optional length) has been entered into the current field
event handling is used to prevent the tab key from acting wierd when all fields are filled out
*/
function focusOnNxtFld(frmObj, fldVal, nxtFldName, e, len) {
	var frmFldObj 	= frmObj[nxtFldName];
	var e 			= e || window.event;    
	var kc 			= e.which || e.keyCode;
	if (fldVal != '' && (!arguments[4] || fldVal.length == len) && kc != 9) {
		frmFldObj.focus();
		frmFldObj.select();
	}
}



/*
Two function below are used in Window Film and Window Replacement rebate forms. Determines if
the entered date is before or after 5/1 and shows/hides various elements based on the result

UPDATE: 20111214 no longer used in Window Film form
*/
function chkInstallDate() {
	var form 	= document.theForm;
	var errMsg	= 'Please enter the installation date in the format MM/DD/YYYY.';
	if (form.InstallDate.value.length != 10) {
		alert(errMsg);
		form.InstallDate.focus();
		return false;
	}
	if (!isDate(form.InstallDate, errMsg)) return false;

	var dateArr		= form.InstallDate.value.split('\/');
	var dateToChk	= new Date(2011, 5, 2);
	if (dateArr[2].length == 2) {
		dateArr[2] = '20' + dateArr[2];
	}
	var dateInstall	= new Date(dateArr[2], dateArr[0], dateArr[1])
	var msDiff		= dateToChk - dateInstall;

	if (msDiff > 0) {
		document.getElementById("beforeMay2").innerHTML = form.InstallDate.value;
		toggle("restOfInstallWrapper", "hidden", "none");
		toggle("formContainer", "hidden", "none");
		toggle("beforeMay2011", "visible", "");
	}
	else {
		toggle("beforeMay2011", "hidden", "none");
		toggle("restOfInstallWrapper", "visible", "");
		toggle("formContainer", "visible", "");
	}
}
/*
function changeInstallDate() {
	var form = document.theForm;
	toggle("getStarted", "visible", "");
	toggle("formContainer", "hidden", "none");
	form.InstallDate.focus();
	form.InstallDate.select();
}
}*/
function changeInstallDate(doWhat) {
	var form = document.theForm;
	
	if (doWhat == 'after') {
		toggle("getStarted", "visible", "");
		toggle("formContainer", "hidden", "none");
	}
	else {
		if (form.installedBy[0].checked) {
			toggle("calContainerCon", "visible", "");
			toggle("calContainerHo", "hidden", "none");
		}
		else {
			toggle("calContainerHo", "visible", "");
			toggle("calContainerCon", "hidden", "none");
		}
		
		toggle("beforeMay2011", "hidden", "none");
	}
	//form.InstallDate.focus();
	//form.InstallDate.select();
}




/*
used in conjuction with JS Calendar
*/
DISABLED_DATES = {
	//add dates here to explicily disable them from selection in the calendar
	//20110422: true
};
HOLIDAY_DATES = {
	//add dates here to display in red and force a warning when selected on calendar
	20110422: true,//good friday
	20110530: true,//memorial day
	20110704: true,//july 4th
	20110905: true,//labor day
	20111124: true,//thanksgiving
	20111125: true,//thanksgiving
	20111223: true,//christmas
	20111226: true,//christmas
	20120102: true,//new years
	20120406: true,//good friday
	20120528: true,//memorial day
	20120704: true,//july 4th
	20120903: true,//labor day
	20121122: true,//thanksgiving
	20121123: true,//thanksgiving
	20121224: true,//christmas
	20121225: true //christmas
};
function swapEl(el2hide, el2show) {
	toggle(el2hide, 'hidden', 'none');
	toggle(el2show, 'visible', '');
}
function hideCal(calObjRef) {
	//alert()
	calObjRef.hide();
	calObjRef.blur();//forces onBlur event to fire
}
function clearSelection(calObjRef) {
	calObjRef.selection.clear(true);
	calObjRef.focus();
}
function doEvent(element,event) {
	var el = document.getElementById(element);
	if (document.createEventObject){
		// dispatch for IE
		var evt = document.createEventObject();
		return el.fireEvent('on' + event, evt)
	}
	else {
		// dispatch for firefox + others
		var evt = document.createEvent("HTMLEvents");
		evt.initEvent(event, true, true); // event type,bubbling,cancelable
		return !el.dispatchEvent(evt);
	}
}
function getDateInfo(date) {
	if (date.getDay() == 6) { 
		return {tooltip : "$300 service fee applies<br />for Saturday turn-ons."}
	}
	//else if (Calendar.dateToInt(date) in HOLIDAY_DATES) {
	//	return {klass : 'DynarchCalendar-weekend', tooltip : "Company holiday, $25 extra for turn-on service."}
	//}
}

function getPaymentDisabled(date) {
	var dayNbr 	= date.getDay();
	var intDate	= Calendar.dateToInt(date)
	return (dayNbr == 0 || dayNbr == 6 || intDate in DISABLED_DATES || intDate in HOLIDAY_DATES) ? true : false;
}
function getServiceDisabled(date) {
	var dayNbr = date.getDay();
	var intDate	= Calendar.dateToInt(date)
	return (dayNbr == 0 || intDate in DISABLED_DATES || intDate in HOLIDAY_DATES) ? true : false;
}

function onSelection(calObjRef, alertsTypes) {
	var doWhat			= true;
	var dateSelNbr 		= calObjRef.selection.get();
	var dateSelDate 	= Calendar.intToDate((dateSelNbr));
	var dateSelDayTxt	= Calendar.printDate(dateSelDate, '%A');
	var dateSelDateTxt	= Calendar.printDate(dateSelDate, '%m/%d/%y');
	var endMsgTxt		= "\n\nClick the 'OK' button to use this date, or 'Cancel' to select another date.";
	if (arguments[1] != undefined) {
		if (alertsTypes["ston"] != undefined && dateSelDate.getDay() == 6) {
			doWhat = confirm("You've selected " + dateSelDateTxt + ", which is a Saturday. There is an $300 service fee for Saturday turn-ons." + endMsgTxt);
		}
		//else if (alertsTypes["holiday"] != undefined && dateSelNbr in HOLIDAY_DATES) {
		//	doWhat = confirm("You've selected " + dateSelDayTxt + " " + dateSelDateTxt + ", which is a company holiday. There is an extra $25 charge for Holiday turn-ons." + endMsgTxt);
		//}
		//else {
			//allows for selection to be accepted, when no alerts are encountered
		//	doWhat = true;
		//}
		
		if (doWhat) {
			hideCal(calObjRef);
			return true;
		}
		else {
			clearSelection(calObjRef)
			return false;
		}
	} 
	//alert(3)
	hideCal(calObjRef);
	return true;
} 




/*
Use for TECFeedback based surveys
*/
function setQuestionNbrs() {
	for (i = 5; i <= 12; i++) {
		document.getElementById('q' + i).value = qNbr++;
	}
}

function setProgressBarStatus(start, end, onOff) {
	var end = end || start + 1;
	//alert(end)
	for (i = start; i < end; i++) {
		if (i != 0) {
			document.getElementById("bar" + i).className = "progressBar" + onOff;
		}
	}
}
	
function turnStepOn(stepNbr) {
	toggle("step" + stepNbr, "visible", "block");
}

function turnStepOff(stepNbr) {
	toggle("step" + stepNbr, "hidden", "none");
}

function doStep(stepNbr, classSuffix) {
	var classSuffix = classSuffix || '';
	var offStepNbr	= (stepNbr - 1 >= 0) ? stepNbr - 1 : 0;

	setProgressBarStatus(stepNbr, null, 'On' + classSuffix);
	setProgressBarStatus(stepNbr + 1, null, 'Off' + classSuffix);

	turnStepOff(offStepNbr);//stepNbr - 1
	turnStepOff(stepNbr + 1);
	turnStepOn(stepNbr);
}


/* used for fancybox title display */
function fbTitle(title, currentArray, currentIndex, currentOpts) {
	return '<span id="fancybox-title-inside"><table><tr><td>Image&nbsp;' + (currentIndex + 1) + '&nbsp;/&nbsp;' + currentArray.length + '</td><td width="100%" style="text-align: left;">' + (title.length ? title : '&nbsp;') + '</td></tr></table></span>';
}



/* used to load list or program contractors for HVAC Maintenance Program */
var hvacMaintloaded = null;
function getContractors(type) {
	if (hvacMaintloaded === 1) {
	  $("#hvacMaintList").slideToggle("slow");
	}
	else {
	  $.ajax({
	        url: "contractors/index.cfm",
	        data: "r=" + Math.random().toString(),
	        dataType: "html",
	        success: function(data){
	          $("#hvacMaintList")
	          .html(data)
	          .slideToggle("slow");
	          hvacMaintloaded = 1;
	        },
	        error: function() {
	        	alert("Oops... an error occure while processing your request.")
	        }
	  });
	}
}


