// javascript functionality for dealing with forms

function checkRequiredFields(form)
{
  var errorMsg = '';
  var errorFields = '';
  
  var totalFields = form.elements.length;
  for(var i = 0; i < totalFields; i++)
  {
    if (getClassName(form.elements[i]) != 'f_interdependent')
    {
      // required fields
      if(getClassName(form.elements[i]) == 'f_required')
      {
        if(Trim(form.elements[i].value) == '')
          errorFields += form.elements[i].id + ', ';
      }
      
      // email fields
      if(getClassName(form.elements[i]) == 'f_email')
      {
        var email = Trim(form.elements[i].value);
        if(email == '' || email.indexOf('.') == -1 || email.indexOf('@') == -1)
        {
          errorMsg += '- Invalid email address.<br>';
          errorFields += form.elements[i].id + ', ';
        }
      }
      
      
      // phone fields
      if(getClassName(form.elements[i]) == 'f_phone')
      {
        var phone = Trim(form.elements[i].value);
        if(phone == '' || !isValidPhoneNumber(phone))
        {
          errorMsg += '- Invalid phone number format.<br>';
          errorFields += form.elements[i].id + ', ';
        }
      }
      
      // DOB
      if(getClassName(form.elements[i]) == 'f_dob')
      {
        var dob = Trim(form.elements[i].value);
        if(dob == '' || !isValidDob(dob))
        {
          errorMsg += '- Invalid date of birth format (yyyy-mm-dd).<br>';
          errorFields += form.elements[i].id + ', ';
        }
      }
      
      // Credit Cards
      if(getClassName(form.elements[i]) == 'f_creditcard')
      {
        var cc = Trim(form.elements[i].value);
        if(cc == '' || !isValidCardNumber(cc))
        {
          errorMsg += '- Invalid Credit Card number.<br>';
          errorFields += form.elements[i].id + ', ';
        }
      }
      
      // Alpha
      if(getClassName(form.elements[i]) == 'f_alpha')
      {
        var val = Trim(form.elements[i].value);
        if (val == '')
        {
          errorMsg += '- Invalid characters (use only a-z and A-Z).<br>';
          errorFields += form.elements[i].id + ', ';
          j = val.length;
        }
        var valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ";
        for (var j=0; j<val.length; j++)
        {
          if (val == '' || valid.indexOf(val.charAt(j)) < 0 || valid.indexOf(val.charAt(j)) < 0)
          {
            errorMsg += '- Invalid characters (use only a-z and A-Z).<br>';
            errorFields += form.elements[i].id + ', ';
            j = val.length;
          }
        }
      }
      
      // Alpha-Numeric
      if(getClassName(form.elements[i]) == 'f_alphanumeric')
      {
        var val = Trim(form.elements[i].value);
        if (val == '')
        {
          errorMsg += '- Invalid characters (use only a-z, A-Z and 0-9).<br>';
          errorFields += form.elements[i].id + ', ';
          j = val.length;
        }
        var valid = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ";
        for (var j=0; j<val.length; j++)
        {
          if (val == '' || valid.indexOf(val.charAt(j)) < 0 || valid.indexOf(val.charAt(j)) < 0)
          {
            errorMsg += '- Invalid characters (use only a-z, A-Z and 0-9).<br>';
            errorFields += form.elements[i].id + ', ';
            j = val.length;
          }
        }
      }
      
    }
  }
	
  
  
	// Interdependent fields
	var interdependent = false;
	for(var i = 0; i < totalFields; i++)
  {
    if(getClassName(form.elements[i]) == 'f_interdependent')
    {
			if(Trim(form.elements[i].value) != '')
			{
				interdependent = true;
			}
    }
  }
	if (interdependent)
	{
		for(var i = 0; i < totalFields; i++)
		{
			if(getClassName(form.elements[i]) != 'f_required' && getClassName(form.elements[i]) == 'f_interdependent')
			{
				if(Trim(form.elements[i].value) == '')
				{
					errorFields += form.elements[i].id + ', ';
				}
			}
		}
	}
	
  
  
  if(errorFields != '')
  {
    errorMsg = 'Please fill in all required fields.<br>- The fields displaying an asterix require your attention.<br>' + errorMsg;
  }
  
	if (form.password != undefined && form.password_confirm != undefined)
	{
		if(form.password.value != '' && form.password_confirm.value != '' && form.password.value != form.password_confirm.value)
		{
			errorMsg += '- The passwords you entered do not match. ';
			errorFields += 'password, password_confirm, ';
		}
	}
  
  if (form.pwd != undefined && form.pwd_confirm != undefined)
	{
		if(form.pwd.value != '' && form.pwd_confirm.value != '' && form.pwd.value != form.pwd_confirm.value)
		{
			errorMsg += '- The passwords you entered do not match. ';
			errorFields += 'pwd, pwd_confirm, ';
		}
	}
  
  
  if (form.disclaimer_check != undefined)
	{
		if (form.disclaimer_check.checked == false)
		{
			errorMsg += '- Please confirm that you agree to the disclaimer. ';
			errorFields += 'disclaimer_check, ';
		}
	}
  
	
  /*
	if (form.card_expmonth != undefined)
	{
		if(form.card_expmonth.value != '' && form.card_expyear.value != ''
			 && !isValidCardExpiry(parseInt(form.card_expmonth.value, 10), parseInt(form.card_expyear.value, 10)))
		{
			errorMsg += 'Invalid credit card expiry date. ';
			errorFields += 'card_expmonth, card_expyear, ';
		}
	}
  */
  
	
  // Display Validation Asterix
  if(errorMsg != '' || errorFields != '')
  {
    if (document.getElementById('msg') == null)
       alert('ERROR: Please add a feedback message field to your form!');
    
    document.getElementById('msg').innerHTML = errorMsg;
    
    alert(errorMsg.replace(/<br>/gi,"\n"));
    
    var asterix = document.getElementsByTagName('span');
    
    var numas = asterix.length;
    for(var j = 0; j < numas; j++)
    {
			if(getClassName(asterix[j]) == 'f_asterix')
      {
        if(errorFields.indexOf(asterix[j].getAttribute('target_field')) != -1)
          asterix[j].style.display = 'inline';
        else
          asterix[j].style.display = 'none';
      }
    }
    return false;
  }
  
  return true;
}

 
function clearForm(formName)
{
  var form = document.getElementById(formName);
  var fields = form.elements.length;

  for(var i = 0; i < fields; i++)
  {
    var elementType = form.elements[i].type;
    if(elementType == 'text' || elementType == 'textarea' || elementType == 'password' || elementType == 'password_confirm')
    {
      form.elements[i].value = '';
    }
    else if(elementType == 'select-one')
    {
      form.elements[i].selectedIndex = 0;
    }
    else if(elementType == 'checkbox')
    {
      form.elements[i].checked = false;
    }
    else if(elementType == 'radio')
    {
      form.elements[i].checked = false;
    }
  }
  
  var asterix = document.getElementsByTagName('span');
  var numas = asterix.length;
  for(var j = 0; j < numas; j++)
  {
		if(getClassName(asterix[j]) == 'f_asterix')
    {
      asterix[j].style.display = 'none';
    }
  }
  
  document.getElementById('msg').style.display = 'none';
}


function confirm_with_alert(msg, href)
{
	if (confirm(msg))
    document.location = href + "&msg=Deletion successful.";
}

function getClassName(element)
{
	if (element.getAttribute('className') == null)
		return element.getAttribute('class'); // FF
	else
		return element.getAttribute('className'); // IE (non-standard, of course)
}

function Trim(str)
{
  return RTrim(LTrim(str));
}

function RTrim(str)
{
  while(str.substring(0,1) == ' ')
  {
    str = str.substring(1, str.length);
  }
  return str;
}

function LTrim(str)
{
  while(str.substring(str.length - 1, str.length) == ' ')
  {
    str = str.substring(0, str.length - 1);
  }
  return str;
}

function isValidPhoneNumber(phone)
{
  var tmp = phone.replace(/\)|\(|\.|-|\+| /g, '');
  return (tmp.search(/^[0-9]{7,32}$/) != -1);
}

function isValidDob(dob)
{
  if (dob.length == 10)
  {
    var tmp = dob.replace(/\\|\/|-|\.| /g, '');
    if (tmp.length == 8)
    {
      if (tmp.search(/^[0-9]{8,8}$/) != -1)
      {
        if (tmp.substring(0,4)*1 >= 1900 && tmp.substring(0,4)*1 <= 2005 )
        {
          if (tmp.substring(4,6)*1 > 0 && tmp.substring(4,6)*1 <= 12 )
          {
            if (tmp.substring(6,8)*1 > 0 && tmp.substring(6,8)*1 <= 31 )
            {
              return true;
            }
          }
        }
      }
    }
  }
  return false;
}

function isValidCardNumber(cardInput) {

  var ccnLength;
  var cPrefix2;
  var nString = "";
  var total = 0;
  var ccNumber = "";
  var i;
  
  // Don't bother checking if the length is 0
  if( cardInput.length == 0 ) return true;
  
  // Strip out all dash and space characters
  for (i = 0; i < cardInput.length; i++) {
    if (cardInput.charCodeAt(i) >= 48 && cardInput.charCodeAt(i) <= 57) {
      ccNumber = ccNumber + cardInput.charAt(i);
    }
    else if (cardInput.charCodeAt(i) != 45 && cardInput.charCodeAt(i) != 32) {
      return false;
    }
  }
  
  // Set variable to credit card length
  ccnLength = ccNumber.length;
  
  // Check card number prefix and length
  if (ccnLength >= 13) {
    cPrefix2 = parseInt(ccNumber.charAt(0) + ccNumber.charAt(1));
    cPrefix3 = parseInt(ccNumber.charAt(0) + ccNumber.charAt(1) + ccNumber.charAt(2));
    cPrefix4 = parseInt(ccNumber.charAt(0) + ccNumber.charAt(1) + ccNumber.charAt(2) + ccNumber.charAt(3));
    if (cPrefix2 > 49 && cPrefix2 < 56) { //Mastercard    ***** NOTE: Test mastercards can start with 50, valid cards cannot
      if (ccnLength != 16) {
        return false;
      }
    } else if (ccNumber.charAt(0) == "4") {    //VISA
      if (ccnLength != 16 && ccnLength != 13) {
          return false;
      }
    } else if (cPrefix2 == 34 || cPrefix2 == 37) { //AMEX
      if (ccnLength != 15) {
          return false;
      }
    } else if ((cPrefix3 > 299 && cPrefix3 < 306) || cPrefix2 == 36 || cPrefix2 == 38) { //Diners Club/Carte Blanche
      if (ccnLength != 14) {
          return false;
      }
    } else if (cPrefix4 == 6011) {  //Discover
      if (ccnLength != 16) {
          return false;
      }
    } else if (cPrefix4 > 3527 && cPrefix4 < 3590) {  //JCB
      if (ccnLength != 16) {
          return false;
      }
    } else if (ccNumber.charAt(0) == "6") {    //SEARS
      if (ccnLength > 16) {
        return false;
      }
    } else {
      return false;
    }
    
    if (ccNumber.charAt(0) != "6") { //SEARS
      //Perform MOD check
      for (i=1; i <= ccnLength; i++) {
        if ((i % 2) == 0) {
          nString = nString + (parseInt(ccNumber.charAt(ccnLength - i)) * 2);
        }
        else {
          nString = nString + ccNumber.charAt(ccnLength - i);
        }
      }
      
      for (i=0; i < nString.length; i++) {
        total = total + parseInt(nString.charAt(i));
      }
        
      if (total % 10 != 0) {
        return false;
      }
      else {
        return true;
      }
    } else {
      //SEARS Card - Do not perform MOD 10 check
      return true;
    }
  }
  else {
    return false;
  }
}

function isValidCardExpiry(expMonth, expYear)
{
  if (isNaN(expMonth) || isNaN(expYear))
  {
    return false;
  }

  var today = new Date();
  if ((today.getFullYear() > expYear) || ((today.getFullYear() == expYear) && (today.getMonth()+1 > expMonth)))
  {
    return false;
  }
  return true;
}

