var showTip = false;

function testFields(form){

    isMissing = false;

    for(i = 0; i < form.elements.length; i++){

        var el = form.elements[i];

        var strRequired = el.getAttribute('required');
        var strLabel = null;
		if(el.getAttribute('label')){
			strLabel = el.getAttribute('label');
		}


		var dataType = null;
		if(el.getAttribute('datatype')){
			dataType = el.getAttribute('datatype');
		}


	   if(strRequired && strRequired == "true" && strLabel){

			var value = "";

			if(form.elements[i].type == "text" || form.elements[i].type == "textarea" || form.elements[i].type == "password"){
				value = form.elements[i].value;
			}
			if(form.elements[i] == "textarea"){
				value = form.elements[i].value;
			}
			if(form.elements[i].type == "select-one"){

				var sIndex = form.elements[i].selectedIndex;
				value = form.elements[i].options[sIndex].value;
			}


			if(form.elements[i].type == "radio"){
				for(j=0; j<form.elements[i].length; j++) {
					if(form.elements[i][j].checked) {
						value = form.elements[i][j].value;
						break;
					}
				}
			}
			if(form.elements[i].type == "checkbox"){
				if(form.elements[i].checked){
					value = form.elements[i].value;
				}
			}
            if(value == '' || value.toLowerCase() == "invalid"){
                showRequiredText(strLabel,el);
                isMissing = true;

            }
        }
		if(dataType && dataType != "" && form.elements[i].value != ""){
			if(form.elements[i].type == "checkbox"){
				if(form.elements[i].checked){
					value = form.elements[i].value;
				}
			}else{
				value = form.elements[i].value;
			}
			switch(dataType)
			{
				case 'phone':
 					  var phone = strip(value);
					  if(phone.length < 7 || phone.length > 10 || parseInt(phone) == 0){
							showRequiredText(value,el);
    						isMissing = true;
					  }
					  break;

				case 'email':
  					  if(!emailCheck(value)){
					  		showRequiredText(value,el);
							isMissing = true;
					  }
					  break;

				case 'zip':
					  if(!isZip(value)){
						  	showRequiredText(value,el);
							isMissing = true;
					  }
	     			  break;

				case 'ssn':
					  if(!isValidSSN(value)){
						  	showRequiredText(value,el);
							isMissing = true;
					  }
	     			  break;

				case 'integer':
					  if(!isInteger(value)){
						  	showRequiredText(value,el);
							isMissing = true;
					  }
	     			  break;

				case 'decimal':
					  if(!isDecimal(value)){
						  	showRequiredText(value,el);
							isMissing = true;
					  }
	     			  break;

				case 'agree':
					  if(value != 'on'){
						  alert('You must check the agreement.');
     					  isMissing = true;
					  }



		   }
		}
    }


    if(isMissing){
       alert('Please check the fields highlighted in red for missing information or errors and re-submit the form.');
	  return false;
    }
    else{
       return true;
    }

}


function showRequiredText(text,el) {

    var isIE	= document.all;

    if(isIE){

        if(showTip && el.parentNode.firstChild.tagName == 'SPAN'){
            el.parentNode.removeChild(el.parentNode.firstChild);
        }
        el.className = 'requiredField';

       if(showTip){
            // add span and br tags with label text
            var tt = document.createElement("span");
            var br = document.createElement("br");
            tt.className = 'requiredText';
            tt.innerHTML = text;
            el.parentNode.appendChild(tt);
            el.parentNode.insertBefore(tt,el);
            el.parentNode.insertBefore(br,el);
        }
        else{
            if(el.type == 'text' || el.type == 'textarea' ){
               if(text != "" && text != null){
					el.value = text;
				}
		   }

        }

        // IE
        if (window.attachEvent) {
            el.attachEvent("onfocus",
                function(){
                    if((showTip) && el.parentNode.firstChild.tagName == 'SPAN'){
                        // remove span tag
                        el.parentNode.removeChild(el.parentNode.firstChild);
                        // remove br tag
                        el.parentNode.removeChild(el.parentNode.firstChild);
                    }
                    else{
                        el.value = '';
                    }
                    // unset class name
                    el.className = null;
                });
        }
    }
    else{
        // firefox

        el.className = 'requiredField';

        if(showTip){
            var tt = document.createElement("span");
            tt.className = 'requiredText';
            tt.innerHTML = text + '<br />';
            el.parentNode.appendChild(tt);
            el.parentNode.insertBefore(tt,el);
        }
        else{
            if(el.type == 'text' || el.type == 'textarea' ){

			   if(text != "" && text != null){

					el.value = text;
				}
		   }
        }

        if (window.addEventListener) {
            el.addEventListener("focus",
                function(){
                    if(showTip){
                        el.parentNode.removeChild(tt);
                    }
                    else{
                        el.value = '';
                    }
                    el.className = null;
                    },false);
        }
    }
}

/* EXAMPLES:

if(!isZip(fieldValue)){
    alert("Please enter a valid " + label);
    form.elements[fieldName].select();
    return false;
}

var phone = strip(fieldValue);
if(phone.length < 7 || phone.length > 7 || parseInt(phone) == 0){
    alert("Please enter a valid " + label);
    form.elements[fieldName].select();
    return false;
}

var areacode = strip(fieldValue);
if(areacode.length < 3 || areacode.length > 3 || parseInt(areacode) == 0){
    alert("Please enter a valid " + label);
    form.elements[fieldName].select();
    return false;
}

if(!emailCheck(fieldValue)){
    alert("Please enter a valid email address");
    form.elements[fieldName].select();
    return false;
}

*/


// -------------------------------------------------------------------
function checkCardType(form) {

	var typeField = "credit_card_type";
	var typeIndex = form.elements[typeField].selectedIndex;
	var typeFieldValue = form.elements[typeField].options[typeIndex].value;

	var numField = "card_number";
	var numFieldValue = form.elements[numField].value;
	var num = numFieldValue.substring(0,1);

	var blnOK = true;
	if((typeFieldValue.toLowerCase() == "american express")&&(num != 3)){
		blnOK = false;
	}
	if((typeFieldValue.toLowerCase() == "american_express")&&(num != 3)){
		blnOK = false;
	}
	if((typeFieldValue.toLowerCase() == "amex")&&(num != 3)){
		blnOK = false;
	}
	if((typeFieldValue.toLowerCase() == "visa")&&(num != 4)){
		blnOK = false;
	}
	if((typeFieldValue.toLowerCase() == "mastercard")&&(num != 5)){
		blnOK = false;
	}
	if((typeFieldValue.toLowerCase() == "discover")&&(num != 6)){
		blnOK = false;
	}

	if(!blnOK){
		alert("The credit card number that you entered does not match the card type that you selected from the available card types that we offer.\n\n" +
			"Please select the correct card type for the credit card.");
		form.elements[typeField].focus();
		return false;
	}

return true;
}



// -------------------------------------------------------------------
function checkExpireDate(form) {

	// make sure the date is in the future

	var monthIndex = form.elements['expire_month'].selectedIndex;
	var expireMonth = form.elements['expire_month'].options[monthIndex].value - 1;

	var yearIndex = form.elements['expire_year'].selectedIndex;
	var expireYear = form.elements['expire_year'].options[yearIndex].value;

	var now = new Date();
    var today = new Date(now.getYear(),now.getMonth(),now.getDate());

	var monthDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var expireDay = monthDays[expireMonth];
	var expire = new Date(expireYear,expireMonth,expireDay);

	if(expire < today){
		alert("The expiration date you selected is invalid.\n\n" +
				"Please select a valid expiration date for the credit card.");
		form.elements['expire_month'].focus();
		return false;
	}

return true;
}

// -------------------------------------------------------------------
function isCreditCard(st) {

	// Tests the credit card number.
	// Encoding only works on cards
	// with less than 19 digits

	if (st.length > 19)
		return (false);
	sum = 0; mul = 1; l = st.length;
	for (i = 0; i < l; i++) {
		digit = st.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 strip(val) {

	// Strips the dashes, spaces, etc
	// from the credit card number

val = "" + val;
	if (!val)
		return "";
	var result = "";
	for (var i=0; i < val.length; i++) {
		character = val.charAt(i);
		if ("0123456789".indexOf(character) != -1)
		result += character;
	}
return result;
}

// -------------------------------------------------------------------
function isZip(s){
    // Check for correct zip code
    reZip = new RegExp(/(^\d{5}$)|(^\d{5}-\d{4}$)/);
    if (!reZip.test(s)) {
         return false;
    }
return true;
}

// -------------------------------------------------------------------
function emailCheck(str){

    var at="@"
    var dot="."
    var lat=str.indexOf(at)
    var lstr=str.length
    var ldot=str.indexOf(dot)
    if (str.indexOf(at)==-1){
       return false;
    }

    if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
       return false;
    }

    if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
        return false;
    }

    if (str.indexOf(at,(lat+1))!=-1){
       return false;
    }

    if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
       return false;
    }

    if (str.indexOf(dot,(lat+2))==-1){
       return false;
    }

    if (str.indexOf(" ")!=-1){
       return false;
    }

    return true;
}

function isValidSSN(value) {
	if (value == '999-99-9999' || value == '999 99 9999' || value == '999999999')
		return true;
    var re = /^([0-6]\d{2}|7[0-6]\d|77[0-2])([ \-]?)(\d{2})\2(\d{4})$/;
    if (!re.test(value)) { return false; }
    var temp = value;
    if (value.indexOf("-") != -1) { temp = (value.split("-")).join(""); }
    if (value.indexOf(" ") != -1) { temp = (value.split(" ")).join(""); }
    if(temp == '000000000')
    	return true;
    if (temp.substring(0, 3) == "000") { return false; }
    if (temp.substring(3, 5) == "00") { return false; }
    if (temp.substring(5, 9) == "0000") { return false; }
    return true;
}

function isInteger(value){
	numbRegExp  = /^[0-9]+$/
	if(!numbRegExp.test(value)) {
		return false;
	}else{
		return true;
	}
}

function isDecimal(value){
	numbRegExp = /^\d*\.{0,1}\d+$/
	if(!numbRegExp.test(value)) {
		return false;
	}else{
		return true;
	}
}

function doReset(form){
    for(i = 0; i < form.elements.length; i++){
        if(form.elements[i].type == "text" || form.elements[i].type == "textarea"){
            form.elements[i].value = "";
        }
        if(form.elements[i].type == "select-one"){
            form.elements[i].selectedIndex = 0;
        }
        if(form.elements[i].type == "radio"){
            form.elements[i][0].checked = true;
        }
        if(form.elements[i].type == "checkbox"){
            form.elements[i].checked = false;
        }
    }
}