// common javascript functionality for dealing with forms

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

function getHREF(href)
{
  var pos = href.indexOf(':') + 2;
  return href.substring(pos, href.length);
}

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;
}

// currently not used
function formatMissingFields(fields)
{
  fields = Trim(fields);
  if (fields == '')
  {
    return '';   // No fields, so no error message.
  }
  
  if(fields.charAt(fields.length - 1) == ',')
  {
    fields = fields.substring(0, fields.length - 1);
  }
  
  var lastPos = fields.lastIndexOf(',');
  if (lastPos < 0)
  {
    // only one field named
    return 'The ' + fields + ' field is not filled in.';
  }
  else
  {
    var pre = fields.substring(0, lastPos);
    var post = fields.substring(lastPos + 1, fields.length);
    return 'The ' + pre + ' and ' + post + ' fields are not filled in.';
  }
}

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

/* Taken from Beanstream examples -- not checked over all that carefully. */
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;
}

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

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_required' && getClassName(form.elements[i]) != 'f_interdependent')
    {
      if(Trim(form.elements[i].value) == '')
      {
        errorFields += form.elements[i].id + ', ';
      }
    }
  }
	
	// 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 (form.country != undefined)
	{
		if((form.country.value == 'CA' || form.country.value == 'US') && (form.state.value.length != 2))
		{
			errorFields += 'state, ';
		}
	}
  
  if(errorFields != '')
  {
    errorMsg += 'Please fill in all required fields. The fields displaying an asterix require your attention. ';
  }
	
	if (form.billing_phone != undefined && form.shipping_phone != undefined)
	{
		var phone = Trim(form.billing_phone.value);
		if(phone != '' && !isValidPhoneNumber(phone))
		{
			errorMsg += 'Invalid phone number format. Please re-enter it. ';
			errorFields += 'billing_phone, ';
		}
		var phone = Trim(form.shipping_phone.value);
		if(phone != '' && !isValidPhoneNumber(phone))
		{
			errorMsg += 'Invalid phone number format. Please re-enter it. ';
			errorFields += 'shipping_phone, ';
		}
	}
	
	if (form.password1 != undefined && form.password2 != undefined)
	{
		if(form.password1.value != '' && form.password2.value != '' && form.password1.value != form.password2.value)
		{
			errorMsg += 'The passwords you entered do not match. ';
			errorFields += 'password1, password2, ';
		}
	}
	
  if (form.password1 != undefined )
  {
    var valid="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    for (var i=0; i<form.password1.value.length; i++) {
        if (valid.indexOf(form.password1.value.charAt(i)) < 0 || valid.indexOf(form.password1.value.charAt(i)) < 0)
        {
          errorMsg += 'Your password contains invalid characters. Use only alphanumeric characters (0-9, a-z and A-Z) ';
          errorFields += 'password1, password2, ';
          i = form.password1.value.length;
        }
    }
  }
	
	if (form.card_number != undefined)
	{
		if(form.card_number.value != '' && !isValidCardNumber(form.card_number.value))
		{
			errorMsg += 'Invalid credit card number. ';
			errorFields += 'card_number, ';
		}
	}
	
	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, ';
		}
	}

	if (form.email != undefined)
	{
		var email = Trim(form.email.value);
		if(email == '' || email.indexOf('.') == -1 || email.indexOf('@') == -1)
		{
			errorMsg += 'Invalid email address. ';
			errorFields += 'email, ';
		}
	}
	
  if(errorMsg != '' || errorFields != '')
  {
    document.getElementById('msg').innerHTML = errorMsg;
    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';
      }
    }
    alert(errorMsg);
    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 == 'password')
    {
      form.elements[i].value = '';
    }
    else if(elementType == 'select-one')
    {
      form.elements[i].selectedIndex = 0;
    }
    else if(elementType == 'checkbox')
    {
      form.elements[i].checked = true;
    }
  }

  // Special case: set country to Canada.
  form.billing_country.value = 'CA';
  form.shipping_country.value = 'CA';

  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';
}


