//
// Functions to validate fields for the end user
//

userFocused=null;

function disableValidation(me)
  {
    var form = me.form;
    if (typeof("form")=="undefined")
        return;
    if (typeof(form.systemvalidate)!="undefined" &&
        typeof(form.systemvalidate.value)!="undefined")
        form.systemvalidate.value='';
    // Mozilla bug - needs this before onsubmit can be set to null
    var dummy = form.onsubmit;
    form.onsubmit=null
  }

function getElementById(id)
  {
    if (typeof(document.getElementById)!="undefined")
        return document.getElementById(id);
    else if (typeof(document.all)!="undefined")
        return document.all[id];
    else
        return {};
  }

function validateFocus(me, always)
  {
    if (typeof(document)=="undefined" ||  typeof(document.getElementById)=="undefined")
        return;
    if (userFocused==me && aways!=true)
        userFocused=null;
    else
      {
        if (typeof(me.type)=="undefined" || me.type!="hidden")
          {
            if (typeof(me.focus)!="undefined")
              {
                me.focus();
                if (typeof(window.setTimeout)!="undefined" && typeof(me.name)!="undefined")
                    window.setTimeout("document.forms[0]." + me.name + ".focus()");
              }
          }
      }
  }

function validateClearFocus()
  {
    userFocused=null;
  }

function validateGeneric(me, validation, re, message, arg)
  {
    if (typeof(me)=="undefined") return;
    if (typeof(arg)!="undefined") re = arg;
    if (typeof(me.length)!="undefined")
      {
        for (var i=0; i<me.length; i++)
            if (validateGeneric(me[i], validation, re, message, arg)==false)
                return false;
        return;
      }
    var value = me.type=="checkbox" ?
                    ( me.checked ? me.value : "") : me.value;
    if (value.search(new RegExp(re))==-1)
      {
        alert(message);
        validateFocus(me);
        return false;
      }
  }

function validateJavascript(me, validation, re, message, arg)
  {
    var value = me.value;
    var form = me.form;
    if (!eval(arg))
      {
        alert(message);
        validateFocus(me);
        return false;
      }
  }

function validateMod10(value)
  {
    var l = value.length;
    var total = 0;
    for (var i=l-2; i>=0; i-=2)
      {
        var n = Number(value.substr(i,1))*2;
        total += n%10 + (n - (n%10))/10;
      }
    for (var i=l-1; i>=0; i-=2)
        total += Number(value.substr(i,1));
    return total%10==0;
  }

validateCardTable = [
    { type : "Visa",       ccv : 3, prefix : ["4"],                           length:[13,16], fn:validateMod10 },
    { type : "Bankcard",   ccv : 0, prefix : ["5610"],                        length:[16],    fn:validateMod10 },
    { type : "Mastercard", ccv : 3, prefix : ["51","52","53","54","55","56"], length:[16],    fn:validateMod10 },
    { type : "AMEX",       ccv : 0, prefix : ["34","37"],                     length:[15],    fn:validateMod10 },
    { type : "Diners",     ccv : 0, prefix : ["300","301","302","303","304","305","36","38"], length:[14], fn:validateMod10 },
    { type : "Carte Blanche", ccv : 0, prefix : ["300","301","302","303","304","305","36","38"], length:[14], fn:validateMod10 },
    { type : "Discover",   ccv : 0, prefix : ["6011"],                        length:[16],    fn:validateMod10 },
    { type : "enRoute",    ccv : 0, prefix : ["2014","2149"],                 length:[15],    fn:null },
    { type : "JCB",        ccv : 0, prefix : ["3","2131","1800"],             length:[15,16], fn:validateMod10 },
    { type : "ABA Test",   ccv : 3, prefix : ["abasuccess","abafailure"],     length:[10],    fn:null }
  ];

function validateCard(me, f)
  {
    var form = me.form;
    var typeField = f;
    var message = "It appears that your credit card number is incorrect. Do you want to continue ?";
    if (typeof(typeField)=="undefined" || typeField=="" || typeof(form[typeField])=="undefined")
      {
        if (!validateMod10(me.value) && !confirm(message))
          {
            validateFocus(me, true);
            return false;
          }
      }
    else
      {
        var typeField = form[typeField];
        var value = me.value;
        if (typeof(typeField.selectedIndex)=="undefined")
            var type = typeField.value;
        else
            var type = typeField[typeField.selectedIndex].text;
        var rows = [];
        for (var i in validateCardTable)
          if (validateCardTable[i].type==type)
              rows[rows.length]=validateCardTable[i];
        var valid = false;
        for (var i in rows)
          {
            var row = rows[i];
            var rowValid = false;
            for (var j in row.prefix)
                rowValid |= row.prefix[j]==value.slice(0,row.prefix[j].length);
            if (!rowValid) continue;
            rowValid = false;
            for (var j in row.length)
                rowValid |= row.length[j]==value.length;
            if (!rowValid) continue;
            if (row.fn!=null)
                rowValid = row.fn(value);
            else
                rowValid = true;
            valid |= rowValid;
            if (valid) break;
          }
        if (!valid && !confirm(message))
          {
            validateFocus(me, true);
            return false;
          }
      }
  }

function validateCCV(me,  f)
  {
    var form = me.form;

    var value = String(me.value);
    if (value.length!=0 && value.search(/^[0-9]*$/)==-1)
      {
        alert("Your CCV must be numeric");
        validateFocus(me);
        return false;
      }

    var typeField = f;
    if (typeof(typeField)=="undefined" || typeField=="" || typeof(form[typeField])=="undefined")
        return;

    var typeField = form[typeField];

    if (typeof(typeField.selectedIndex)=="undefined")
        var type = typeField.value;
    else
        var type = typeField[typeField.selectedIndex].text;
    var rows = [];
    for (var i in validateCardTable)
      if (validateCardTable[i].type==type)
          rows[rows.length]=validateCardTable[i];
    for (var i in rows)
      {
        var row = rows[i];
        if (row.ccv!=0 && row.ccv!=value.length)
          {
           alert("Please enter the last " + String(row.ccv) + " numbers of the CCV for your credit card.",String(row.ccv));
            validateFocus(me);
            return false;
          }
      }
  }

userValidate = [
  { name : "Credit Card Number", fn : "validateCard", re : "", message : "Invalid credit card number", arg : "Credit card type field name" },
  { name : "Numeric", fn : "validateGeneric", re : "[0-9]+", message : "Field must be numeric", arg : "" },
  { name : "Alphanumeric", fn : "validateGeneric", re : "[A-Za-z0-9]+", message : "Field must be alphanumeric", arg : ""},
  { name : "Email Address", fn : "validateGeneric", re : "^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$", message : "Invalid email address", arg : ""},
  { name : "Regular Expression", fn : "validateGeneric", re : "", message : "Invalid field", arg : "Regular Expression"},
  { name : "Javascript", fn : "validateJavascript", re : "", message : "Invalid field", arg : "Javascript code"},
];

function setCookie(c_name,value,expiredays)
  {
	var exdate=new Date();
	exdate.setDate(exdate.getDate()+expiredays);
	document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
  }
  
  
  

