
function viewRouteMap()
{
	var hWnd = window.open('popup_routeMap.php', 'Routemap','width=370,height=500,directories=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,resizable=no');
}

function viewStopMap(mapPhoto)
{
	var hWnd = window.open('popup_stopMap.php?mapPhoto=' + mapPhoto, 'Stopmap','width=430,height=430,directories=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,resizable=no');
}

function viewSecurityCodePopup()
{
	var hWnd = window.open('popup_securityCode.php', 'securityCodeOverview','width=430,height=430,directories=no,location=no,menubar=no,scrollbars=yes,status=no,toolbar=no,resizable=yes');
}

function imageOff(imageName) {
	if (document.images && doIt=="yes") {
		document[imageName].src = eval(imageName + '_off.src');
	}
}

function imageOn(imageName) {
	if (document.images && doIt=="yes") {
		document[imageName].src = eval(imageName + '_on.src');
	}
}

function changeClass(object, newClass) {
	objRef = document.getElementById(object);
	objRef.className = newClass;
}

function openWindow(url, windowName, width, height) {
	if(screen.width){
		var winl = (screen.width - width) / 2;
		var wint = (screen.height - height) / 2;
	} else{
		winl = 0;
		wint = 0;
	}
	if (winl < 0) winl = 0;
	if (wint < 0) wint = 0;
	
	var settings = '';
	
	settings += 'height=' + height + ',';
	settings += 'width=' + width + ',';
	settings += 'top=200,left=200,';
	settings += 'directories=no,location=no,menubar=no,scrollbars=yes,status=no,toolbar=no,resizable=yes';
	
	var win = window.open(url, windowName, settings);
}

function trim (str) {
	while (str.charAt(0) == ' ') {
		str = str.substring(1);
	}
	
	while (str.charAt(str.length - 1) == ' ') {
		str = str.substring(0, str.length - 1);
	}
	
	return str;
}

function isEmailValid(sEmail) {
	sEmail = trim(sEmail);
	
	if (sEmail === '') {
		return false;
	}
	
	//Define RegEx string
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	
	//Test email address
	if (filter.test(sEmail)) {
		return true;
	} else {
		return false;
	}
}

function isValidZipcode(sZip) {
	sZip = trim(sZip);
	
	//Valid formats:
	//  99999               (5)
	//  99999-9999         (10)
	//  99999 9999         (10)
	//  999999999           (9)
	//  AAAAAA (Canadian)   (6)
	//  AAA AAA (Canadian)  (7)
	
	//First, check length - must be 5, 10, 9, or 6 characters long
	if (sZip.length != 5 && sZip.length != 10 && sZip.length != 9 && sZip.length != 6 && sZip.length != 7) {
		return false;
	}
	
	//If ZIP code is 5 or 9 characters, they must all be numbers
	if (sZip.length == 5 || sZip.length == 9) {
		if (isNaN(sZip)) {
			return false;
		}
	}
		
	//If ZIP code is 10 characters, must be 99999-9999 or 99999 9999
	if (sZip.length == 10) {
		//6th character must be a dash or space
		if(!sZip.indexOf('-') == 5 && !sZip.indexOf(' ') == 5) {
			return false;
		}
		
		//Check that first 5 characters and last 4 characters are all numbers
		var firstFive = sZip.substring(0, 5);
		var lastFour = sZip.substring(6, 10);
		
		if (isNaN(firstFive) || isNaN(lastFour)) {
			return false;
		}
	}
	
	//If ZIP code is 6 characters, it must be Canadian and must NOT be all numbers
	if (sZip.length == 6) {
		if (!isNaN(sZip)) {
			return false;
		}
		
		//First character cannot be a number
		firstChar = sZip.substring(0, 1);
		if (!isNaN(firstChar)) {
			return false;
		}
	}
	
	
	//If ZIP code is 7 characters, it must be Canadian and must NOT be all numbers
	if (sZip.length == 7) {
		if (!isNaN(sZip)) {
			return false;
		}
		
		//First character cannot be a number
		firstChar = sZip.substring(0, 1);
		if (!isNaN(firstChar)) {
			return false;
		}
		
		//Fourth character must be a dash or space
		if(!sZip.indexOf('-') == 3 && !sZip.indexOf(' ') == 3) {
			return false;
		}
	}
	
	return true;
}


function addDays(myDate, days) {
    return new Date(myDate + (days * 24 * 60 * 60 * 1000));
}

function FormatNumber(expr, decplaces) {
	var str = "" + Math.round(eval(expr) * Math.pow(10,decplaces));
	
	while (str.length <= decplaces) {
		str = "0" + str;
	}
	
	var decpoint = str.length - decplaces;
	
	return str.substring(0,decpoint) + "." + str.substring(decpoint, str.length);
}

   
/*
var STATE_NAMES = new Array(
   "Alabama", "Alaska", "American Samoa", "Arizona", "Arkansas",
   "California", "Colorado", "Connecticut", "Delaware",
   "District of Columbia", "Federated States of Micronesia",
   "Florida", "Georgia", "Guam", "Hawaii", "Idaho", "Illinois",
   "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine",
   "Marshall Islands", "Maryland", "Massachusetts", "Michigan",
   "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska",
   "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York",
   "North Carolina", "North Dakota", "Northern Mariana Islands", 
   "Ohio", "Oklahoma", "Oregon", "Palau", "Pennsylvania", "Puerto Rico",
   "Rhode Island", "South Carolina", "South Dakota", "Tennessee",
   "Texas", "Utah", "Vermont", "Virgin Islands", "Virginia",
   "Washington", "West Virginia", "Wisconsin", "Wyoming",
   "Armed Forces Africa", "Armed Forces Americas",
   "Armed Forces Canada", "Armed Forces Europe",
   "Armed Forces Middle east", "Armed Forces Pacific");
*/

function isValidState(value) {
	var STATES = new Array("AL","AK","AS","AZ","AR","CA","CO","CT",
	   "DE","DC","FM","FL","GA","GU","HI","ID","IL","IN","IA","KS",
	   "KY","LA","ME","MH","MD","MA","MI","MN","MS","MO","MT","NE",
	   "NV","NH","NJ","NM","NY","NC","ND","MP","OH","OK","OR","PW",
	   "PA","PR","RI","SC","SD","TN","TX","UT","VT","VI","VA","WA",
	   "WV","WI","WY","AA","AE","AP");
	   
	if (value == null || value == "") {
		return false;
	}
	
	var st = value.toUpperCase();
	
	//Loop through array of state abbreviations
	for (var i = 0; i < STATES.length; i++) {
		if (STATES[i] == st) {
			return true;
		}
	}
	
	return false;
}

function isValidProvince(value) {
	var PROVINCES = new Array("AB","BC","MB", "NB", "NF", "NT", 
		"NS", "ON", "PE", "QC", "SK", "YT");
		
	if (value == null || value == "") {
		return false;
	}
	
	var prov = value.toUpperCase();
	
	//Loop through array of province abbreviations
	for (var i = 0; i < PROVINCES.length; i++) {
		if (PROVINCES[i] == prov) {
			return true;
		}
	}
	
	return false;
}

function jsvoid() {
	//Do nothing
}

function isValidDate(sDate) {
	//Check to make sure two slashes are present in the date provided
	if (sDate.lastIndexOf('/') <= sDate.indexOf('/')) {
		return false;
	}

	//Split on slash
	sDateArray = sDate.split('/');
	
	sMonth = sDateArray[0];
	sDay = sDateArray[1];
	sYear = sDateArray[2];
	
	//Validate year part
	if (isNaN(sYear)) {
		return false;
	}
	
	if (sYear.length == 2) {
		sYear = parseInt('20' + sYear);
	} else {
		if (sYear.length != 4) {
			return false;
		}
	}
	
	if (sDay <= daysInMonth(sMonth, sYear)) {
		return true;
	} else {
		return false;
	}
}

function isLeapYear(yr) {
	if      (yr % 4 != 0)   return false;
	else if (yr % 400 == 0) return true;
	else if (yr % 100 == 0) return false;
	else                    return true;
}

function daysInMonth(mn, yr) {
	var mDay;
	
	if ((mn == 4) || (mn == 6) || (mn == 9) || (mn == 11)) { 
		mDay = 30;
	} else if (mn == 2) {
		//calling leap year function 
		mDay = isLeapYear(yr) ? 29 : 28;    
	} else {
		mDay = 31;
	}
	
	return mDay; 
}

function getRadioValue(objRadio) {
	var itemChecked = false;
	
	for (i=0; i < objRadio.length; i++) {
		if (objRadio[i].checked) {
			itemChecked = true;
			return objRadio[i].value;
		}
	}
	
	if (itemChecked == false) {
		return '';
	}
}

function setRadioValue(objRadio, sValue) {
	for (i=0; i < objRadio.length; i++) {
		if (objRadio[i].value == sValue) {
			objRadio[i].checked = true;
		}
	}
}

function autoFillStateZip(oCityBox, oStateBox, oZipBox) {
	//Default to current values in text boxes
	sCity = oCityBox.value;
	sState = oStateBox.value;
	sZipCode = oZipBox.value;
	
	switch (trim(oCityBox.value.toLowerCase())) {
		case 'oak harbor':
			sCity = 'Oak Harbor';
			sState = 'WA';
			sZipCode = '98277';
			break;
		case 'coupeville':
			sCity = 'Coupeville';
			sState = 'WA';
			sZipCode = '98239';
			break;
		case 'greenbank':
			sCity = 'Greenbank';
			sState = 'WA';
			sZipCode = '98253';
			break;
		case 'freeland':
			sCity = 'Freeland';
			sState = 'WA';
			sZipCode = '98249';
			break;
		case 'langley':
			sCity = 'Langley';
			sState = 'WA';
			sZipCode = '98260';
			break;
		case 'clinton':
			sCity = 'Clinton';
			sState = 'WA';
			sZipCode = '98236';
			break;
	}
	
	//Update text boxes
	oCityBox.value = sCity;
	oZipBox.value = sZipCode;
	oStateBox.value = sState;
	
}


function capitalizeState(oStateBox) {
	oStateBox.value = oStateBox.value.toUpperCase();
}

//------------------------------------------------
// START OF CREDIT CARD VALIDATION FUNCTIONS
//------------------------------------------------
function isValidCreditCardNumber(ccNum, ccType) {
  	if (ccNum.length > 0) {
		if (!LuhnCheck(ccNum) || !validateCCNum(ccType, ccNum)) {
			return false;
		}
	} else {
		return false;
	}
	
	return true;
}

function validateCCNum(cardType, cardNum) {
	var result = false;
	cardType = cardType.toUpperCase();
	
	var cardLen = cardNum.length;
	var firstdig = cardNum.substring(0,1);
	var seconddig = cardNum.substring(1,2);
	var first4digs = cardNum.substring(0,4);

	switch (cardType) {
		case "VISA":
			result = ((cardLen == 16) || (cardLen == 13)) && (firstdig == "4");
			break;
		case "AMEX":
			var validNums = "47";
			result = (cardLen == 15) && (firstdig == "3") && (validNums.indexOf(seconddig)>=0);
			break;
		case "MASTERCARD":
			var validNums = "12345";
			result = (cardLen == 16) && (firstdig == "5") && (validNums.indexOf(seconddig)>=0);
			break;
		case "DISCOVER":
			result = (cardLen == 16) && (first4digs == "6011");
			break;
		case "DINERS":
			var validNums = "068";
			result = (cardLen == 14) && (firstdig == "3") && (validNums.indexOf(seconddig)>=0);
			break;
	}
	
	return result;
}

function LuhnCheck(str) {
	var result = true;
	var sum = 0; 
	var mul = 1; 
	var strLen = str.length;

	for (i = 0; i < strLen; i++) {
		var digit = str.substring(strLen-i-1,strLen-i);
		var tproduct = parseInt(digit ,10)*mul;
		
		if (tproduct >= 10) {
			sum += (tproduct % 10) + 1;
		} else {
			sum += tproduct;
		}
		
		if (mul == 1) {
			mul++;
		} else {
			mul--;
		}
	}
	
	if ((sum % 10) != 0) {
		result = false;
	}
	
	return result;
}

function isValidExpDate(formValue) {
	var result = true;

 	if (result && (formValue.length > 0)) {
 		var elems = formValue.split("/");
 		
 		result = (elems.length == 2); // should be two components
		
 		var expired = false;
 		
 		if (result) {
 			var month = parseInt(elems[0],10);
 			var year = parseInt(elems[1],10);
 			
 			if (elems[1].length == 2) {
 				year += 2000;
			}
 			
 			var now = new Date();
 			
 			var nowMonth = now.getMonth() + 1;
 			var nowYear = now.getFullYear();
 			
 			expired = (nowYear > year) || ((nowYear == year ) && (nowMonth > month));
 			
			result = allDigits(elems[0]) && (month > 0) && (month < 13) &&
					 allDigits(elems[1]) && ((elems[1].length == 2) || (elems[1].length == 4));
 		}
 		
  		if (!result) {
			result = false;
		} else if (expired) {
 			result = false;
		}
	} 
	
	return result;
}
//------------------------------------------------
// END OF CREDIT CARD VALIDATION FUNCTIONS
//------------------------------------------------

function allDigits(str)
{
	return inValidCharSet(str,"0123456789");
}

function inValidCharSet(str,charset)
{
	var result = true;
	
	for (var i=0;i<str.length;i++)
		if (charset.indexOf(str.substr(i,1))<0)
		{
			result = false;
			break;
		}
	
	return result;
}

function hideShowElement(elementId, behavior) {
	if (behavior == 'toggle') {
		//Show or hide element depending on the current state
	    if (document.getElementById(elementId).style.display == '') {
	        document.getElementById(elementId).style.display = 'none';
	    } else {
	        document.getElementById(elementId).style.display = '';
	    }
	} else if (behavior == 'show') {
		//Show element
		document.getElementById(elementId).style.display = '';
	} else if (behavior == 'hide') {
		//Hide element
		document.getElementById(elementId).style.display = 'none';
	}
}

function selectOption(selectBoxId, method, matchText) {
	//Get ref to object
	var oSelect = document.getElementById(selectBoxId);
	var optionValue = '';
	var optionText = '';
	
	if (oSelect && oSelect.options) {
		//Loop through select options
		for (var i=0; i < oSelect.options.length; i++) {
			optionValue = oSelect.options[i].value;
			optionText = oSelect.options[i].text;
			
			if (method == 'value' && matchText == optionValue) {
				oSelect.options[i].selected = true;
				return;
			} else if (method == 'text' && matchText == optionText) {
				oSelect.options[i].selected = true;
				return;
			}
		}
	}
}

function getSelectValue(id) {
	var oSelect = document.getElementById(id);
	
	if (oSelect) {
		return oSelect.options[oSelect.selectedIndex].value;
	}
}

function insertDateTimeUserStamp(objectId, currentUsername) {
	//Build date/time/user stamp
	var dateTimeUserStamp = ' [';
	dateTimeUserStamp += currentUsername + ' ';
	
	//Add in date/time
	var now = new Date();
	var nowMonth = now.getMonth() + 1;
	var nowDay = now.getDate();
	var nowYear = now.getFullYear();
	var nowHour = now.getHours();
	var nowMinutes = now.getMinutes();
	var nowMinutesDisplay = "";
	
	nowMinutesDisplay = nowMinutes;
	
	if (nowMinutes < 10) {
		nowMinutesDisplay = "0" + nowMinutes;
	}
	
	if (nowHour >= 12) {
		nowAmpm = 'pm';
		
		if (nowHour > 12) {
			nowHour = nowHour - 12;
		}
	} else {
		nowAmpm = 'am';
	}
	
	dateTimeUserStamp += nowMonth + '/' + nowDay + '/' + nowYear + ' ' + nowHour + ':' + nowMinutesDisplay + ' ' + nowAmpm + '] ';
	
	insertAtCaret(objectId, dateTimeUserStamp);
	
	//Trim contents of target box
	var trimmed = $.trim($("#" + objectId).val());
	$("#" + objectId).val(trimmed + ' ');
}

function insertAtCaret(areaId, text) {
	var txtarea = document.getElementById(areaId);
	var scrollPos = txtarea.scrollTop;
	var strPos = 0;
	
	var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ?
		"ff" : (document.selection ? "ie" : false ));
		
	if (br == "ie") {
		txtarea.focus();
		var range = document.selection.createRange();
		range.moveStart ('character', -txtarea.value.length);
		strPos = range.text.length;
	} else if (br == "ff") {
		strPos = txtarea.selectionStart;
	}
	
	var front = (txtarea.value).substring(0,strPos);
	var back = (txtarea.value).substring(strPos, txtarea.value.length);
	
	txtarea.value = front + text + back;
	strPos = strPos + text.length;
	
	if (br == "ie") {
		txtarea.focus();
		var range = document.selection.createRange();
		range.moveStart ('character', -txtarea.value.length);
		range.moveStart ('character', strPos);
		range.moveEnd ('character', 0);
		range.select();
	} else if (br == "ff") {
		txtarea.selectionStart = strPos;
		txtarea.selectionEnd = strPos;
		txtarea.focus();
	}
	
	txtarea.scrollTop = scrollPos;
}

function FormatPhoneNumber(phoneNumber) {
	phoneNumber = $.trim(phoneNumber);
	var phoneNumber_original = phoneNumber;
	
	phoneNumber = phoneNumber.replace(/[()\- ]/gi, "");
	
	if (phoneNumber.length == 10) {
		return "(" + phoneNumber.substr(0, 3) + ") " + phoneNumber.substr(3, 3) + "-" + phoneNumber.substr(6, 4);
	} else if (phoneNumber.length == 7) {
		return phoneNumber.substr(0, 3) + "-" + phoneNumber.substr(3, 4);
	} else {
		//Return unmodified version
		return phoneNumber_original;
	}
}

/**
 * Shorthand function to escape strings in jScript for use in URLs. Native escape() 
 * function does not escape plus signs (and possibly other things) but the 
 * encodeURIComponent() function does.
 *
 * @param string The string that needs to be encoded.
 *
 * @return string The encoded string, ready for use in a URL
 */
function jsEscape(string) {
	return encodeURIComponent(string);
}
