var digits = "0123456789";
var lowerCaseLetters = "abcdefghijklmnopqrstuvwxyz";
var upperCaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var whiteSpace = " \t\n\r";
var decimalPointDelimiter = ".";
var phoneNumberDelimiters = "()- \t";
var validPhoneChars = digits + phoneNumberDelimiters;
var ssnDelimiters = "- \t";
var validSsnChars = digits + ssnDelimiters;
var digitsInSocialSecurityNumber = 9;
var digitsInPhoneNumber = 10;
var creditCardDelimiters = " ";
var daysInMonth = Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var childWindow;

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsChildWindow() {
  if (opener == null || self.name != "childWindow") {
    document.location.href = errorScriptPage & "?error=childFunction";
  	return false;
  }
  else return true;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function ConfirmOperation(message) {
  if (message == "") message = "Are you sure?            ";
  return window.confirm(message);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function NewWindow(url, width, height) {
  if (childWindow != null && childWindow.open) childWindow.close();
  wLeft = screen.width / 2 - width / 2;
  wTop = screen.height / 2 - height / 2;
  childWindow = window.open(url, 'childWindow', 'location=0,toolbar=0,menubar=0,resizable=0,status=0,scrollbars=0,width=' + width + ',height=' + height + ',left=' + wLeft + ',top=' + wTop);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function NewScrollWindow(url, width, height) {
  if (childWindow != null && childWindow.open) childWindow.close();
  wLeft = screen.width / 2 - width / 2;
  wTop = screen.height / 2 - height / 2;
  childWindow = window.open(url, 'childWindow', 'location=0,toolbar=0,menubar=0,resizable=0,status=0,scrollbars=1,width=' + width + ',height=' + height + ',left=' + wLeft + ',top=' + wTop);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsEmail(s) {
  if (s == "") return false;
  else if (s.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1) return true;
  else return false;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsEmpty(s) {
  return ((s == null) || (s.length == 0));
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsWhiteSpace (s) {
var i;

  if (IsEmpty(s)) return true;
  for (i = 0; i < s.length; i++) {   
    var c = s.charAt(i);
    if (whiteSpace.indexOf(c) == -1) return false;
  }

  return true;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function CutString (inputStr, length, dots) {
  if (inputStr.length > length) return inputStr.substr(0, length) + dots;
  else return inputStr;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function StripCharsInBag (s, bag) {
var i;
var returnString = "";

  for (i = 0; i < s.length; i++) {   
    var c = s.charAt(i);
    if (bag.indexOf(c) == -1) returnString += c;
  }

  return returnString;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function StripCharsNotInBag (s, bag) {
var i;
var returnString = "";

  for (i = 0; i < s.length; i++) {   
    var c = s.charAt(i);
    if (bag.indexOf(c) != -1) returnString += c;
  }
 
  return returnString;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function StripWhiteSpace (s) {
  return StripCharsInBag (s, whiteSpace);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function NeatCharsInBag (s, bag, replaceChar) {
var i, j;
var returnString = "";

  if (replaceChar == null || replaceChar == "") replaceChar = " ";
  for (i = 0; i < s.length; i++) {
    if (bag.indexOf(s.charAt(i)) == -1) break;
  }
  for (j = i; j < s.length; j++) {   
    if (bag.indexOf(s.charAt(j)) == -1) returnString += s.charAt(j);
	else if (j > 0 && bag.indexOf(s.charAt(j - 1)) == -1) returnString += replaceChar;
  }

  return returnString;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsInteger (s) {
var i;

  if (IsEmpty(s)) return false;

  var startPos = (s.charAt(0) == "-" || s.charAt(0) == "+") ? 1 : 0;
  for (i = startPos; i < s.length; i++) {   
    var c = s.charAt(i);
    if (!(c >= "0" && c <= "9")) return false;
  }

  return true;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsFloat (s) {
var i;
var seenDecimalPoint = false;

  if (IsEmpty(s)) return false;

  if (s == decimalPointDelimiter) return false;

  var startPos = (s.charAt(0) == "-" || s.charAt(0) == "+") ? 1 : 0;
  for (i = startPos; i < s.length; i++) {   
    var c = s.charAt(i);
    if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
    else if (!(c >= "0" && c <= "9")) return false;
  }
  return true;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsAlpha (s) {
var i;

  if (IsEmpty(s)) return false;

  for (i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    if (!(c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) return false;
  }
  return true;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsAlphaNumeric (s) {
var i;

  if (IsEmpty(s)) return false;

  for (i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    if (!((c >= "a" && c <= "z") || (c >= "A" && c <= "Z") || (c >= "0" && c <= "9"))) return false;
  }
  return true;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsPhone (s) {
  if (IsEmpty(s)) return false;

  var normalizedPhone = StripCharsInBag(s, phoneNumberDelimiters)
  if (!IsInteger(normalizedPhone) || normalizedPhone.length != digitsInPhoneNumber) return false;
  return true;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsSsn (s) {

  if (IsEmpty(s)) return false;

  var normalizedSsn = StripCharsInBag(s, ssnDelimiters);
  if (!IsInteger(normalizedSsn) || normalizedSsn.length != digitsInSocialSecurityNumber) return false;
  return true;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function FormatCurrency(num) {
  num = num.toString().replace(/\$|\,/g,'');
  if (isNaN(num)) num = "0";
  sign = (num == (num = Math.abs(num)));
  num = Math.floor(num * 100 + 0.50000000001);
  cents = num % 100;
  num = Math.floor(num / 100).toString();
  if (cents < 10) cents = "0" + cents;
  for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++)
    num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
  return (((sign) ? '' : '-') + '$' + num + '.' + cents);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function Reformat (s) {
var arg;
var sPos = 0;
var resultString = "";
  for (var i = 1; i < Reformat.arguments.length; i++) {
    arg = Reformat.arguments[i];
    if (i % 2 == 1) resultString += arg;
    else {
      resultString += s.substring(sPos, sPos + arg);
      sPos += arg;
    }
  }
  return resultString;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function ReformatPhone (s) {
  return Reformat(s, "(", 3, ") ", 3, "-", 4);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function ReformatSsn (s) {
  return Reformat(s, "", 3, "-", 2, "-", 4);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsEmail (s) {
  if (IsEmpty(s)) return false;
  if (IsWhiteSpace(s)) return false;

  var i = 1;
  var sLength = s.length;

  while ((i < sLength) && (s.charAt(i) != "@")) i++;

  if ((i >= sLength) || (s.charAt(i) != "@")) return false;
  else i += 2;

  while ((i < sLength) && (s.charAt(i) != ".")) i++;

  if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
  else return true;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsIntegerInRange (s, a, b) {
  if (IsEmpty(s)) return false;
  if (!IsInteger(s, false)) return false;

  var num = parseInt (s);
  return ((num >= a) && (num <= b));
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsDate (month, day, year) {
var today = new Date();
  if (year == null || year.length == 0) year = "" + today.getYear();
  if (! (IsInteger(year) && (year.length == 2 || year.length == 4)
      && IsIntegerInRange(month, 1, 12) && IsIntegerInRange (day, 1, 31) ) ) return false;

    var intYear = parseInt(year);
    var intMonth = parseInt(month);
    var intDay = parseInt(day);
    if (intDay > daysInMonth[intMonth - 1]) return false;
    if (intMonth == 2 && intDay > (!(year % 100 == 0) && (year % 4 == 0 || year % 400 == 0) ? 29 : 28)) return false;

    return true;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsCreditCard(s) {
  s = StripCharsInBag(s, whiteSpace);

  if (s.length > 19) return (false);

  sum = 0; mul = 1; l = s.length;
  for (i = 0; i < l; i++) {
    digit = s.substring(l - i - 1, l - i);
    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) return true;
  else return false;

} 

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsVisa(s) {
  s = StripCharsInBag(s, whiteSpace);

  if ((s.length == 16 || s.length == 13) && s.substring(0, 1) == 4) return IsCreditCard(s);
  return false;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsMasterCard(s) {
  s = StripCharsInBag(s, whiteSpace);

  firstdig = s.substring(0, 1);
  seconddig = s.substring(1, 2);

  if (s.length == 16 && firstdig == 5 && (seconddig >= 1 && seconddig <= 5)) return IsCreditCard(s);
  return false;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsAmericanExpress(s) {
  s = StripCharsInBag(s, whiteSpace);

  firstdig = s.substring(0, 1);
  seconddig = s.substring(1, 2);
  if (s.length == 15 && firstdig == 3 && (seconddig == 4 || seconddig == 7)) return IsCreditCard(s);
  return false;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsDiscover(s) {
  s = StripCharsInBag(s, whiteSpace);

  first4digs = s.substring(0, 4);

  if (s.length == 16 && first4digs == "6011") return IsCreditCard(s);
  return false;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
function IsAnyCard(s) {
  s = StripCharsInBag(s, whiteSpace);

  if (!IsCreditCard(s)) return false;
  if (!IsMasterCard(s) && !IsVisa(s) && !IsAmericanExpress(s) && !IsDiscover(cc)) return false;
  return true;
}
///////////////////////////////////////////////////////////////////////////////
// Cookies : SetCookie (name, value), DeleteCookie (name), getCookieVal (offset), GetCookie (name)
///////////////////////////////////////////////////////////////////////////////
function SetCookie (name, value) {  
  var argv = SetCookie.arguments;  
  var argc = SetCookie.arguments.length;  
  var expires = (argc > 2) ? argv[2] : null;  
  var path = (argc > 3) ? argv[3] : null;  
  var domain = (argc > 4) ? argv[4] : null;  
  var secure = (argc > 5) ? argv[5] : false;  
  document.cookie = name + "=" + escape (value) + 
  ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + 
  ((path == null) ? "" : ("; path=" + path)) +  
  ((domain == null) ? "" : ("; domain=" + domain)) +    
  ((secure == true) ? "; secure" : "");
}
function DeleteCookie (name) {  
  var exp = new Date();  
  exp.setTime (exp.getTime() - 1);  
  var cval = GetCookie (name);  
  document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
}
function getCookieVal (offset) {  
  var endstr = document.cookie.indexOf (";", offset);  
  if (endstr == -1)    
  endstr = document.cookie.length;  
  return unescape(document.cookie.substring(offset, endstr));
}
function GetCookie (name) {  
  var arg = name + "=";  
  var alen = arg.length;  
  var clen = document.cookie.length;  
  var i = 0;  
  while (i < clen) {    
	var j = i + alen;    
	if (document.cookie.substring(i, j) == arg)      
	return getCookieVal (j);    
	i = document.cookie.indexOf(" ", i) + 1;    
	if (i == 0) break;   
  }  
  return null;
}
///////////////////////////////////////////////////////////////////////////////
// CreditCard Validation : validateCard(ccNo,ccType,ccMonth,ccYear);
///////////////////////////////////////////////////////////////////////////////
function mod10( cardNumber ) { 
	var ar = new Array( cardNumber.length );
	var i = 0,sum = 0;
  for( i = 0; i < cardNumber.length; ++i ) {
    ar[i] = parseInt(cardNumber.charAt(i));
  }
  for( i = ar.length -2; i >= 0; i-=2 ) {
    ar[i] *= 2;							 
    if( ar[i] > 9 ) ar[i]-=9;	
  }										
  for( i = 0; i < ar.length; ++i ) {
    sum += ar[i];			
  }
  return (((sum%10)==0)?true:false);	 	
}

function expired( month, year ) {
  var now = new Date();							
  var expiresIn = new Date(year,month,0,0,0);
  expiresIn.setMonth(expiresIn.getMonth()+1);
  if( now.getTime() < expiresIn.getTime() ) return false;
  return true;									
}

function validateCard(cardNumber,cardType,cardMonth,cardYear) {
  if( cardNumber.length == 0 ) {
    alert("Please enter a valid card number.");
    return false;				
  }
  for( var i = 0; i < cardNumber.length; ++i ) {
    var c = cardNumber.charAt(i);
    if( c < '0' || c > '9' ) {
      alert("Please enter a valid card number. Use only digits. do not use spaces or hyphens.");
      return false;
    }
  }
  var length = cardNumber.length;
  switch( cardType ) {
    case 'a':
      if( length != 15 ) {
        alert("Please enter a valid American Express Card number.");
        return;
      }
      var prefix = parseInt( cardNumber.substring(0,2));
      if( prefix != 34 && prefix != 37 ) {
        alert("Please enter a valid American Express Card number.");
        return;
      }
      break;
    case 'd':
      if( length != 16 ) {
        alert("Please enter a valid Discover Card number.");
        return;
      }
      var prefix = parseInt( cardNumber.substring(0,4));
      if( prefix != 6011 ) {
        alert("Please enter a valid Discover Card number.");
        return;
      }
      break;
 		case 'm':
      if( length != 16 ) {
        alert("Please enter a valid MasterCard number.");
        return;
      }
      var prefix = parseInt( cardNumber.substring(0,2));
      if( prefix < 51 || prefix > 55) {
        alert("Please enter a valid MasterCard Card number.");
        return;
      }
      break;
  	case 'v':
      if( length != 16 && length != 13 ) {
        alert("Please enter a valid Visa Card number.");
        return;
      }
      var prefix = parseInt( cardNumber.substring(0,1));
      if( prefix != 4 ) {
        alert("Please enter a valid Visa Card number.");
        return;
      }
      break;
  }
  if( !mod10( cardNumber ) ) {
    alert("Sorry! this is not a valid credit card number.");
    return false;
  }
  if( expired( cardMonth, cardYear ) ) {
    alert("Sorry! The expiration date you have entered would make this card invalid.");
    return false;
  }
  return true;
}