/* ============================================================================
** eMatrix Client Implementation Javascript
** Gef - <gef@webmatrix.com.au>
** Sept 7th, 2004
** (c) Web Matrix - 2004-2005
** File: em_ci.js
*/

var invalidStr = "";

var menuImages = new Array();
var numImages = 0;
var imgPreloadDone = false;
/* ----------------------------------------------------------------------------
** preLoad images
*/
function changeImages() {
  if(!imgPreloadDone) {
    imgPreLoad('menu_about', 'menu_privacy', 'menu_terms', 'menu_direct');
  }
  if(document.images) {
    for (var i=0; i<changeImages.arguments.length; i+=2) {
      if(changeImages.arguments[i] && document[changeImages.arguments[i]]) {
        document[changeImages.arguments[i]].src = changeImages.arguments[i+1];
      }
    }
  }
}

function newImage(arg) {
  if (document.images) {
    var rslt = new Image();
    rslt.src = arg;
    return rslt;
  }
}

// ---------------------------------------------------------------------------
// Preload images for product/wellbeing navigation
function imgPreLoad() {
  for (var i=0; i<imgPreLoad.arguments.length; i++) {
    nImg = new Array();
    nImg[0] = newImage("/images/" + imgPreLoad.arguments[i] + "_off.gif");
    nImg[1] = newImage("/images/" + imgPreLoad.arguments[i] + "_on.gif");
    menuImages[numImages++] = nImg;
  }
  imgPreloadDone = true;
}

/* ----------------------------------------------------------------------------
** get document elements
*/
function getElem(elemName) {
  var obj = false;
  if(document.all) {
    if(document.all[elemName]) {
      obj = document.all[elemName];
    }
  }
  if(obj == false) {
    if(document.getElementById) {
      if(document.getElementById(elemName)) {
        obj = document.getElementById(elemName);
      }
    }
  }
  return obj;
}

/* ----------------------------------------------------------------------------
** Check if a form field is empty
*/
function emptyValue(elemName) {
  var obj = getElem(elemName);
  if(obj && (obj.value == '' || obj.value.length == 0)) {
    return true;
  }
  return false;
}

/* ----------------------------------------------------------------------------
** add to validation output string
*/
function addInvalidStr(string) {
  string = "- " + string;
  if(invalidStr.length > 0) {
    invalidStr = invalidStr + "<br>";
  }
  invalidStr = invalidStr + string;
}

/* ----------------------------------------------------------------------------
** clear validation output
*/
function clearInvalidStr() {
  var output = getElem('em_output');
  invalidStr = "";
  if(output) {
    output.innerHTML = "";
  }
}

/* ----------------------------------------------------------------------------
** Validation output
*/
function displayInvalidStr() {
  var output = getElem('em_output');
  if(output) {
    output.innerHTML = "<div style='border:1px solid black;background-color:white; width:100%;padding:0px;margin:0px;'><font class='invalidOutputText'><div style='padding:4px;'><b>Invalid Input:</b><br>"+invalidStr+"</font></div></div>";
  } else {
    // replace <br> with \n
    alert(invalidStr.replace(/<br>/g, "\n"));
  }
}

/* ----------------------------------------------------------------------------
** general number validation
*/
function validateCCN(ccnValue, ccType) {
  // strip spaces
  var ccn = ccnValue.replace(/ /g, "");
  // regex to check for only numbers or spaces
  var ccRegexp = (/[^\d ]/);

  // checks for empty number
  if(ccnValue.length == 0 || ccn.length == 0) {
    addInvalidStr("Missing credit card number");
    return false;
  }
  
  // test for invalid characters (allows only spaces or digits)
  var invalidChars = ccRegexp.test(ccnValue);
  if(invalidChars) {
    addInvalidStr("Credit card number contains invalid characters.");
    return false;
  }
  
  // test specific lengths & prefix's
  var prefixRegexp;
  var result = 0;
  switch(ccType) {
    case 'mastercard':
      prefixRegexp = (/^5[1-5]/);
      if(!(ccn.length == 16)) {
        result = 1;
      }
      break;
    case 'visa':
      prefixRegexp = (/^4/);
      if(!(ccn.length == 16 || ccn.length == 13)) {
        result = 1;
      }
      break;
    case "bankcard":
      prefixRegexp = (/^5610/);
      if(!(ccn.length == 16)) {
        result = 1;
      }
      break;
    default:
      result = 2;
      break;
  }
  if(result == 1) {
    addInvalidStr("Credit card number is invalid. (Failed length check)");
    return false;
  } else if(result == 2) {
    addInvalidStr("Unknown card type. (invalid card type)");
    return false;
  }
  
  // test ccn prefix
  if(!prefixRegexp.test(ccn)) {
    addInvalidStr("Credit card number is invalid. (Failed prefix check)");
    return false;
  }
 
/*
  if(!luhnCheckCCN(ccn, ccType)) {
    addInvalidStr("Credit card number is invalid. (Failed luhn check)");
    return false;
  }
*/
  
  return true;
}

/* ----------------------------------------------------------------------------
** do luhn (mod10) check on input number
*/
function luhnCheckCCN(ccnValue, ccType) {
  var numProduct;
  var numProductIdx;
  var csTotal = 0;
  
  for(var i = ccnValue.length - 1; i > 0; i--) {
    csTotal += parseInt(ccnValue.charAt(i));
    i--;
    numProduct = String((ccnValue.charAt(i) * 2));
    for(var j = 0; j < numProduct.length; j++) {
      csTotal += parseInt(numProduct.charAt(j));
    }
  }
  if((csTotal % 10) != 0) {
    return false;
  }
  return true;
}



/* ----------------------------------------------------------------------------
** Validate customer input
*/
function em_ci_validate(checkUON) {
  var valid = true;
  var ccType = getElem('em_cct').value;
  var ccNumLength = 0;
  
  clearInvalidStr();
  
  if(emptyValue('vpc_CardHolder')) {
    valid = false;
    addInvalidStr("You must provide your name.");
  }

  if(emptyValue('vpc_Amount') || isNaN(getElem('vpc_Amount').value) || getElem('vpc_Amount').value == '0') {
    if(getElem('vpc_Amount').value != 51) { // ignore missing amount for collect transactions
      valid = false;
      addInvalidStr("Transaction amount is invalid.");
    }
  }

  if( (getElem('Card_Month').value == 0) ) {
    valid = false;
    addInvalidStr("Please select the month in which your credit card expires.");
  }
  
  if( ( (getElem('Card_Month').value < getElem('cmonth').value) && (getElem('Card_Year').value == getElem('cyear').value) ) ||
      ( (getElem('Card_Year').value < getElem('cyear').value) )
       ) {
    valid = false;
    addInvalidStr("Credit card has expired.");     
  }
  
  
  
  // -> Credit card number validation
  if(!validateCCN(getElem('vpc_CardNum').value, ccType)) {
    valid = false;
    addInvalidStr("Credit card number failed validation.");
  }

  if(valid) {
    if( (getElem('Card_Month').value == getElem('cmonth').value) && (getElem('Card_Year').value == getElem('cyear').value) ) {
      if(!confirm("The expiry date entered indicates that your credit\ncard will expire at the end of this month.\nClick Ok if this is correct. or click Cancel to\ncorrect it.")) {
        valid = false;
      }
      if(!valid) {
        addInvalidStr("Process cancelled due to incorrect expiry.");
      }
    }
  }
  
  if( (getElem('em_cct').value == 'visa' ) || (getElem('em_cct').value == 'mastercard') ) {
	  if(emptyValue('em_cvc')) {
	    valid = false;
	    addInvalidStr("Card Verification Number.");
	  }
  }
  
  if(valid == false) {
    displayInvalidStr();
  } else {
    clearInvalidStr();
  }
  
  return valid;
}

function updateExpiryDate() {
  var month = getElem('Card_Month').value;
  var year  = getElem('Card_Year').value;
  getElem('vpc_CardExp').value = year + month;
  
}

function updateOrderInfo() {
  
  var cardholder = getElem('vpc_CardHolder').value;
  var invoice = getElem('em_inv').value;
  
  getElem('vpc_OrderInfo').value = "Invoice:" + invoice + " by " + cardholder;
 
}


function em_ci_reset() {
  clearInvalidStr();
}


