function blurControl(control){
	//if (control.value != control.oldValue) alert("change");
	if (control)
		control.oldValue = control.value;
}
function updateButtons()
{
	var btnSave = document.getElementById('btnSave');
	var btnSaveClose = document.getElementById('btnSaveClose');
	var btnNext = document.getElementById('btnNext');
	var btnPrevious = document.getElementById('btnPrevious');
	var btnCancel = document.getElementById('btnCancel');
	if (btnSave || btnSaveClose || btnNext || btnPrevious || btnCancel)
	{
		var pageDisabled = true;
		if (btnSave)
			pageDisabled = pageDisabled || btnSave.disabled;
		if (btnSaveClose)
			pageDisabled = pageDisabled || btnSaveClose.disabled;
		if (btnNext)
			pageDisabled = pageDisabled || btnNext.disabled;
		if (btnPrevious)
			pageDisabled = pageDisabled || btnPrevious.disabled;
		if (pageDisabled)
		{
			if (btnSave)
				btnSave.disabled = false;
			if (btnSaveClose)
				btnSaveClose.disabled = false;
			if (btnNext)
			{
				btnNext.disabled = false;
				if (btnNext.getAttribute("enableonchange"))
					if (btnNext.getAttribute("enableonchange") == 0)
						btnNext.disabled = true;
			}
			if (btnPrevious)
			{
				btnPrevious.disabled = false;
				if (btnPrevious.getAttribute("enableonchange"))
					if (btnPrevious.getAttribute("enableonchange") == 0)
						btnPrevious.disabled = true;
			}
		}
		//try setting navigation for onbeforeunload
		setNavigation();
	}
}
/* 
function disableButton(buttonID) {
    document.getElementById(buttonID).disabled=true;
}
*/
function pressControl(control){
    //clicks the btnSave button when the enter key is pressed outside a textarea
    pressCustomControl(control,"btnSave");
}
function pressCustomControl(control, buttonName){
    //clicks the "buttonName" button when the enter key is pressed outside a textarea
	if (window.event)
	{
		if(window.event.keyCode < 47 && window.event.keyCode > 57)
			window.event.keyCode = 9008999; 
		if(window.event.keyCode == 9008999) 
			return false;
		if(control.type == "textarea")
		{
			updateButtons();
			return true;
		}
		else
		{
			if (window.event.keyCode == 13)
			{
				if (document.getElementById(buttonName))
					if (!document.getElementById(buttonName).disabled)
						document.getElementById(buttonName).click();
			}
			else
				updateButtons();
		}
	}
	else
	{
		if (control.parentNode)
		if (control.parentNode.parentNode)
		if (control.parentNode.parentNode.parentWindow)
		if (control.parentNode.parentNode.parentWindow.event) //it's more readable this way
		{
			if(control.parentNode.parentNode.parentWindow.event.keyCode < 47 && control.parentNode.parentNode.parentWindow.event.keyCode > 57)
				control.parentNode.parentNode.parentWindow.event.keyCode = 9008999; 
			if(control.parentNode.parentNode.parentWindow.event.keyCode == 9008999)
				return false;  
			else
				updateButtons();
		}
	}
}
function clickControl(control){
	updateButtons();
}
function changeControl(control){
	updateButtons();
}

/* Precon: Page have to have __FRSEVENTTARGET|__EVENTARGUMENT hiddenfield
function __do_FRSPostBack(eventTarget, eventArgument) {
		var theform;
		if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
			theform = document.Form1;
		}
		else {
			theform = document.forms["Form1"];
		}		
		try{
			theform.__FRSEVENTTARGET.value = eventTarget.split("$").join(":");
		}
		catch(e){
		theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
		};
		//theform.__EVENTARGUMENT.value = eventArgument;
		theform.submit();
}
*/

function clickFRSButton(control){ //any FRS button click
	setForFRSButton(); //disable annoying message.  
	var boolBtnSaveExists = (document.getElementById("btnSave") != null);
	
	var boolBtnSaveEnabled = false;
		
	if (boolBtnSaveExists)
	{
		boolBtnSaveEnabled = !document.getElementById("btnSave").disabled;
	}
	if (control.id == "btnSave")
	{
		var returnValue = validateForm();
		return returnValue;
	}
		
	if (!boolBtnSaveExists && (control.id == "btnNext" || control.id == "btnPrevious" || control.id == "btnCancel"))
	{
		return true;
	}
	if (boolBtnSaveExists && boolBtnSaveEnabled && (control.id == "btnNext" || control.id == "btnPrevious"))
	{	
		return validateForm(); 
	}
	if (document.getElementById("hidClickStatus"))
	{
		var hidClickStatus = document.getElementById("hidClickStatus");
		if (!boolBtnSaveEnabled && control.id == "btnCancel")
		{
			hidClickStatus.value = "0"; //don't save
			return true;
		}
		if (boolBtnSaveEnabled && control.id == "btnCancel")
		{
			if (!confirm("Do you wish to save your changes?\n\nClick OK to save your changes\n\nClick Cancel to abandon your changes"))
			{
				hidClickStatus.value = "0"; //don't save
				return true;
			}
			else
			{
				if (validateForm())
				{
					hidClickStatus.value = "1"; //save from the cancel click
					return true;
				}
				else
				{
					return false; //cancel save attempt
				}
			}
		}
	}
	return true;
}
function pressFormKey(e,ControlIDToClick){ 
	//any button pressed anywhere in the form
	//if we have a non-standard page (e.g. a search pane), pass the ID of the control that you want to click on a return
	//		it will still try to click on btnSave if ControlIDToClick doesn't exist
	var key;
	if (window.event)
		key = window.event.keyCode;     //IE
	else
		key = e.which;     //firefox
	if (key != 13)
		return true;
	if (window.event.srcElement)
		if (window.event.srcElement.type)
			if (window.event.srcElement.type == "textarea") //TO DO: support FireFox
				return true;
	var boolClickOnControl = false;
	if (ControlIDToClick)
		if (document.getElementById(ControlIDToClick))
			if (!document.getElementById(ControlIDToClick).disabled)
				document.getElementById(ControlIDToClick).click();
	if (document.getElementById("btnSave"))
		if (!document.getElementById("btnSave").disabled)
			document.getElementById("btnSave").click();
	return false;
}
function addEditorControlEvents(ID)
{
	if (ID)
		if (document.getElementById(ID))
			if (document.getElementById(ID).Document)
				if (document.getElementById(ID).Document.body)
				{
					//TO DO: change the followign two lines to EVAL statements that create two functions with names based on the ID doing the same things:
					//e.g. strOnkeyUpFunctionName = "EditorControlOnkeyUp" + ID;
					//e.g. strOnUnloadFunctionName = "EditorControlOnUnload" + ID;
					if (document.getElementById(ID).Document.body.onkeyup)
						document.getElementById(ID).Document.body.onkeyup = function temp1(){pressControl(document.getElementById(ID).Document.body);};
					if (document.getElementById(ID).Document.body.onunload)
						document.getElementById(ID).Document.body.onunload = function temp3(){pressControl(document.getElementById(ID).Document.body);};
				}
}
function getEditorControlText(ID)
{ //ID: the id of the editor control's frame - where ID is the ASP.NET name of the control. Returns null if the text isn;t found
	if ("idContentID"+ID)
		if (document.getElementById("idContentID"+ID))
			if (document.getElementById("idContentID"+ID).Document)
				if (document.getElementById("idContentID"+ID).Document.body)
					return document.getElementById("idContentID"+ID).Document.body.innerHTML;
	return null;
}
function WorkingWithAreaRedirect(URL,btnSaveControlID,hidRedirectUrlControlID)
{ //used in conjunction with the working with area dropdown
	var btnSave = document.getElementById(btnSaveControlID);
	var hidRedirectUrl = document.getElementById(hidRedirectUrlControlID);
	if (hidRedirectUrl)
		hidRedirectUrl.value = "";  //just in case
	if (!URL) //no can do
		return false;
	if (!btnSave || !hidRedirectUrl)
	{ //no need to click on something
		location.href = URL;
		return true;
	}
	if (btnSave.disabled)
	{ //no need to click on something
		location.href = URL;
		return true;
	}
	//do the click
	hidRedirectUrl.value = URL;
	btnSave.click();
	return true;
}
function IsDecimal(sText)
{
	var regex = /^-?\d+(\.\d+)?$/
	return regex.test(sText);
}
function IsPositiveDecimal(sText)
{
	var regex = /^\d+(\.\d+)?$/
	return regex.test(sText);
}
function IsInteger(sText)
{
	var regex = /^-?\d+$/; // ^\d+$ any string containing one or more digits
	return regex.test(sText);
}
function IsPositiveInteger(sText)
{
	var regex = /^\d+$/; // ^\d+$ any string containing one or more digits
	return regex.test(sText);
}
function IsPositiveIntegerGreaterThanZero(sText)
{
	if (IsPositiveInteger(sText))
		if (Number(sText) > 0)
			return true;
	return false;
}

function IsFloat(sText)
{
	return sText.length>0 && !(/[^0-9.]/).test(sText) && (/\.\d/).test(sText);
}
function IsPositiveFloat(sText)
{
	if (IsFloat(sText) || IsInteger(sText))
		if (Number(sText) >= 0)
			return true;
	return false;
}
function IsPositiveFloatGreaterThanZero(sText)
{
	if (IsFloat(sText) || IsInteger(sText))
		if (Number(sText) > 0)
			return true;
	return false;
}
function isURL(argvalue) {

  if (argvalue.indexOf(" ") != -1)
    return false;
  else if (argvalue.indexOf("http://") == -1)
    return false;
  else if (argvalue == "http://")
    return false;
  else if (argvalue.indexOf("http://") > 0)
    return false;

  argvalue = argvalue.substring(7, argvalue.length);
  if (argvalue.indexOf(".") == -1)
    return false;
  else if (argvalue.indexOf(".") == 0)
    return false;
  else if (argvalue.charAt(argvalue.length - 1) == ".")
    return false;

  if (argvalue.indexOf("/") != -1) {
    argvalue = argvalue.substring(0, argvalue.indexOf("/"));
    if (argvalue.charAt(argvalue.length - 1) == ".")
      return false;
  }

  if (argvalue.indexOf(":") != -1) {
    if (argvalue.indexOf(":") == (argvalue.length - 1))
      return false;
    else if (argvalue.charAt(argvalue.indexOf(":") + 1) == ".")
      return false;
    argvalue = argvalue.substring(0, argvalue.indexOf(":"));
    if (argvalue.charAt(argvalue.length - 1) == ".")
      return false;
  }
  return true;
}

function validateText(fieldId,message)
{
	// ensures that something is entered into a text field
	if (isWhitespace(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateMandatoryEmail(fieldId,message)
{
	// ensures that an email address is entered into a text field
	if (isWhitespace(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	if (!isEmail(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateOptionalEmail(fieldId,message)
{
	// ensures that nothing or an email address is entered into a text field
	if (!isWhitespace(document.getElementById(fieldId).value))
		return validateMandatoryEmail(fieldId,message)
	return true;
}
function validateMandatoryInteger(fieldId,message)
{
	// ensures that an integer is entered into a text field
	if (document.getElementById(fieldId).value == "")
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	if (!IsInteger(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	// TO DO - finish this!!
	return true;
}
function validateOptionalInteger(fieldId,message)
{
	// ensures that nothing or an integer is entered into a text field
	if (document.getElementById(fieldId).value == "")
		return true
	if (!IsPositiveInteger(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateMandatoryPositiveInteger(fieldId,message)
{
	// ensures that an integer >=0 is entered into a text field
	if (document.getElementById(fieldId).value == "")
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	if (!IsPositiveInteger(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	// TO DO - finish this!!
	return true;
}
function validateMandatoryPositiveIntegerGreaterThanZero(fieldId,message)
{
	// ensures that an integer >=0 is entered into a text field
	if (document.getElementById(fieldId).value == "")
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	if (!IsPositiveIntegerGreaterThanZero(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	// TO DO - finish this!!
	return true;
}

function validateMandatoryPositiveIntegerGreaterThanZero(fieldId,message)
{
	// ensures that an integer >0 is entered into a text field
	if (document.getElementById(fieldId).value == "")
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	if (!IsPositiveInteger(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	if (document.getElementById(fieldId).value == 0)
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateOptionalPositiveInteger(fieldId,message)
{
	// ensures that nothing or an integer >=0 is entered into a text field
	if (document.getElementById(fieldId).value == "")
		return true;
	
	if (!IsPositiveInteger(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateMandatoryDecimal(fieldId,message)
{
	// ensures that a decimal is entered into a text field
	if (document.getElementById(fieldId).value == "")
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	if (!IsDecimal(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateMandatoryPositiveDecimal(fieldId,message)
{
	// ensures that a decimal >=0 is entered into a text field
	if (document.getElementById(fieldId).value == "")
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	
	if (!IsPositiveDecimal(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateOptionalPositiveDecimal(fieldId,message)
{
	// ensures that nothing or a decimal >=0 is entered into a text field
	if (document.getElementById(fieldId).value == "")
		return true;
		
	if (!IsPositiveDecimal(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateMandatoryPositiveDecimalGreaterThanZero(fieldId,message)
{
	// ensures that a decimal >=0 is entered into a text field
	if (document.getElementById(fieldId).value == "")
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	
	if (!IsPositiveDecimal(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	
	if (document.getElementById(fieldId).value == 0)
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}

	return true;
}
function validateMandatoryDate(fieldId,message)
{
	// ensures that a date is entered into a text field
	if (!isDate(document.getElementById(fieldId).value,'d/M/yyyy'))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateMandatoryDateGreaterThanToday(fieldId,message)
{
	// ensures that a date is entered into a text field
	if (!isDate(document.getElementById(fieldId).value,'d/M/yyyy'))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	var today = new Date()
	if (compareDates(formatDate(today,'d/M/yyyy'),'d/M/yyyy',document.getElementById(fieldId).value,'d/M/yyyy')!=0)
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}

	return true;
}
function validateDateEarlierThan(fieldEarlyId,fieldLateId,message)
{
	// ensures that the date entered into text field fieldEarlyId is the same as or earlier than the one entered into fieldLateId
	if (compareDates(document.getElementById(fieldEarlyId).value,'d/M/yyyy',document.getElementById(fieldLateId).value,'d/M/yyyy')!=0)
	{
		alert(message);
		document.getElementById(fieldEarlyId).select();
		document.getElementById(fieldEarlyId).focus();
		return false;
	}
	return true;
}
function validateOptionalDate(fieldId,message)
{
	// ensures that a date is entered into a text field
	if (document.getElementById(fieldId).value == "")
		return true;
	if (!isDate(document.getElementById(fieldId).value,'d/M/yyyy'))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateSelect(fieldId,message,defaultValue)
{
	// ensures that the default value in a select field isn't selected
	if (document.getElementById(fieldId).options[document.getElementById(fieldId).selectedIndex].value == defaultValue)
	{
		alert(message);
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateOptionalImage(fieldId,message)
{
	// TO DO - finish this!!
	return true;
}
function validateUrl(fieldId,message)
{
	// ensures that a URL is entered into a text field
	if (document.getElementById(fieldId).value == "" || !isURL(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateOptionalUrl(fieldId,message)
{
	// ensures that a URL is entered into a text field
	if (document.getElementById(fieldId).value == "")
		return true;
	return validateUrl(fieldId,message);
}
function validateEditor(fieldId,message)
{
	// ensures that something is entered into an editor control
	if (document.getElementById(fieldId))
		if (document.getElementById(fieldId).value)
			if (document.getElementById(fieldId).value == "")
			{
				alert(message);
				return false;
			}
	if (document.getElementById(fieldId))
		if(document.getElementById(fieldId).Document)
			if(document.getElementById(fieldId).Document.body)
				if(document.getElementById(fieldId).Document.body.innerHTML)
					if (document.getElementById(fieldId).Document.body.innerHTML == "")
					{
						alert(message);
						return false;
					}
	return true;
}
function validateMandatoryFloat(fieldId,message)
{
	// ensures that a positive float is entered into a text field
	if (document.getElementById(fieldId).value == "")
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	if (!IsPositiveFloat(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateMandatoryFloatGreaterThanZero(fieldId,message)
{
	// ensures that a positive float is entered into a text field
	if (document.getElementById(fieldId).value == "")
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	if (!IsPositiveFloatGreaterThanZero(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function validateOptionalFloat(fieldId,message)
{
	// ensures that nothing or a positive float is entered into a text field
	if (document.getElementById(fieldId).value == "")
		return true;
	if (!IsPositiveFloat(document.getElementById(fieldId).value))
	{
		alert(message);
		document.getElementById(fieldId).select();
		document.getElementById(fieldId).focus();
		return false;
	}
	return true;
}
function testdigit(s){
	for(i=0;i<s.length;i++ ) {
		var c = s.charAt(i);
		if(!(isDigit(c))){
			return false;
		}
	} 
	return true;
}


//TO DO: move this to creditcard.js
function isDigit (c){
	return ((c >= "0") && (c <= "9"));
} 
function creditno(CardNumber){
	var no_digit = CardNumber.length;
	var oddoeven = no_digit & 1;
	var sum = 0;
	for (var count = 0; count < no_digit; count++) {
		var digit = parseInt(CardNumber.charAt(count));
		if (!((count & 1) ^ oddoeven)) {
			digit *= 2;
			if (digit > 9)
				digit -= 9;
		}
		sum += digit;
	}
	if (sum % 10 == 0)
		return true;
	else
		return false;
}
var ccErrorNo = 0;
var ccErrors = new Array ()

ccErrors [0] = "Unknown card type";
ccErrors [1] = "No card number provided";
ccErrors [2] = "Credit card number is in invalid format";
ccErrors [3] = "Credit card number is invalid";
ccErrors [4] = "Credit card number has an inappropriate number of digits";

function checkCreditCardCustom (cardnumber, cardname) {

     
  var cards = new Array();
  cards [0] = {name: "Visa", 
               length: "13,16", 
               prefixes: "4",
               checkdigit: true};
  cards [1] = {name: "MasterCard", 
               length: "16", 
               prefixes: "51,52,53,54,55",
               checkdigit: true};
  cards [2] = {name: "DinersClub", 
               length: "14,", 
               prefixes: "300,301,302,303,304,305,36,38",
               checkdigit: true};
  cards [3] = {name: "CarteBlanche", 
               length: "14", 
               prefixes: "300,301,302,303,304,305,36,38",
               checkdigit: true};
  cards [4] = {name: "AmEx", 
               length: "15", 
               prefixes: "34,37",
               checkdigit: true};
  cards [5] = {name: "Discover", 
               length: "16", 
               prefixes: "6011",
               checkdigit: true};
  cards [6] = {name: "JCB", 
               length: "15,16", 
               prefixes: "3,1800,2131",
               checkdigit: true};
  cards [7] = {name: "Enroute", 
               length: "15", 
               prefixes: "2014,2149",
               checkdigit: true};
               
  var cardType = -1;
  for (var i=0; i<cards.length; i++) {

    if (cardname.toLowerCase () == cards[i].name.toLowerCase()) {
      cardType = i;
      break;
    }
  }
  
  if (cardType == -1) {
     ccErrorNo = 0;
     return false; 
  }
   
  if (cardnumber.length == 0)  {
     ccErrorNo = 1;
     return false; 
  }
  
  var cardNo = cardnumber
  var cardexp = /^([0-9]{4})\s?([0-9]{4})\s?([0-9]{4})\s?([0-9]{1,4})$/;
  if (!cardexp.exec(cardNo))  {
     ccErrorNo = 2;
     return false; 
  }
    
  cardexp.exec(cardNo);
  cardNo = RegExp.$1 + RegExp.$2 + RegExp.$3 + RegExp.$4;
       
  if (cards[cardType].checkdigit) {
    var checksum = 0;                                  // running checksum total
    var mychar = "";                                   // next char to process
    var j = 1;                                         // takes value of 1 or 2
  
    var calc;
    for (i = cardNo.length - 1; i >= 0; i--) {
    
      calc = Number(cardNo.charAt(i)) * j;
    
      if (calc > 9) {
        checksum = checksum + 1;
        calc = calc - 10;
      }
    
      checksum = checksum + calc;
    
      if (j ==1) {j = 2} else {j = 1};
    } 
  
    if (checksum % 10 != 0)  {
     ccErrorNo = 3;
     return false; 
    }
  }  

  var LengthValid = false;
  var PrefixValid = false; 
  var undefined; 

  var prefix = new Array ();
  var lengths = new Array ();
    
  prefix = cards[cardType].prefixes.split(",");
      
  for (i=0; i<prefix.length; i++) {
    var exp = new RegExp ("^" + prefix[i]);
    if (exp.test (cardNo)) PrefixValid = true;
  }
      
  if (!PrefixValid) {
     ccErrorNo = 3;
     return false; 
  }
    
  lengths = cards[cardType].length.split(",");
  for (j=0; j<lengths.length; j++) {
    if (cardNo.length == lengths[j]) LengthValid = true;
  }
  
  if (!LengthValid) {
     ccErrorNo = 4;
     return false; 
  };   
  
  return true;
}

//Preference class, use with the thickbox's AJAX thing
//instantiate by using the following:
//var prefNew = new Preference('ENCRYPTED_PREFERENCEID_HERE',boolValue);
function Preference(ID,value)
{
	var _id;
	var _value;
    this._id = id;
    this._value = value;
	GetID = function() { //returns the encrypted value of the preference ID
		return _id;
	}
	GetValue = function() {
		return _value;
	}
	SetID = function(ID) {
		_id = ID;
	}
	SetValue = function(Value) {
		_value = Value;
	}
}

//Returns the value of the preference's ID if it exists in the preference array, otherwise returns null
function FindIDInPreferenceArray(ID,PreferenceArray)
{
	if (PreferenceArray == null)
		return null;
	if (!PreferenceArray.length)
		return null;
	for(i=0;i<PreferenceArray.length;i++ )
		if (PreferenceArray[i].GetID() && PreferenceArray[i].GetValue())
			if (PreferenceArray[i].GetID() == ID)
				return PreferenceArray[i].GetValue();
	return null;
}
function validateMergeText(strUserInput,strFieldName,strarrValidMergeFields)
{
	//returns true if:
	//* there are no merge fields in strUserInput
	//* all of the merge fields in strUserInput exist in strarrValidMergeFields
	//returns false if:
	//* there are any invalid merge fields in strUserInput
	
	//strUserInput: string that the user entered
	//strFieldName: user-friendly name of the field that is being validated
	//strarrValidMergeFields:array of valid merge fields
	if (strUserInput == "")
		return true; //nothing entered, so is good
	var intLeftPos = 0;
	var strFoundMergeField = "";
	while (true)
	{
		if (strUserInput.indexOf("[",intLeftPos)==-1 && strUserInput.indexOf("]",intLeftPos)==-1)
			return true; //no more merge fields to the right
		var strMismatch = "There is a mismatched pair of merge field brackets in the "+strFieldName+".\n\nPlease ensure that all merge field brackets are opened with [ and closed with ].";
		if ((strUserInput.indexOf("[",intLeftPos)==-1 && strUserInput.indexOf("]",intLeftPos)!=-1) || (strUserInput.indexOf("[",intLeftPos)!=-1 && strUserInput.indexOf("]",intLeftPos)==-1))
		{ //missing [ or ]
			alert(strMismatch);
			return false;
		}
		if (strUserInput.indexOf("[",intLeftPos) > strUserInput.indexOf("]",intLeftPos))
		{ //[ comes after ]
			alert(strMismatch);
			return false;
		}
		if (strarrValidMergeFields.length == 0)
			return false; //we have no merge fields, so the merge field passed is incorrect
		intLeftPos = strUserInput.indexOf("[",intLeftPos);
		strFoundMergeField = strUserInput.slice(intLeftPos,1+strUserInput.indexOf("]",intLeftPos));
		var boolValidMergeField = false;
		for (var i=0; i<strarrValidMergeFields.length; i++)
			if (strarrValidMergeFields[i] == strFoundMergeField)
				boolValidMergeField = true;
		if (!boolValidMergeField)
		{
			alert("The "+strFoundMergeField+" merge field is invalid.\n\nPlease ensure that only valid merge fields are entered.");
			return false;
		}
		intLeftPos = 1 + strUserInput.indexOf("]",intLeftPos); //move on to search for the next merge field
		if (intLeftPos >= strUserInput.length - 1)
			return true;
	}
	return true;
}
