var d=document;
var debug=0;
var errors=false;
var dobMMfocus=false;
var dobDDfocus=false;
var snCheckedOnce = false;
var snPassedVal = false;
var fieldError = "false";
var frm='';
var errTest=-1;
//This global flag is set in the fieldValidate function as each form field is validated.
//It tells the errMessage function whether to append the error text into the label element or not.
//This is required for form fields that validate both their own values and checks if other form fields
//are properly filled out, i.e. the birthdate fields.

/* POST COMMENT */
function fieldValidateCommentForm(fObj, frmId) {
	var fId = $(fObj).attr('id');
	var fVal = $.trim($(fObj).val());

	switch(fId) {
		default:
			break;
    }
    //errTest=-1
    if(errTest!=-1) {
        returnCode = errMessage(fObj,errTest,frmId);
        errorField = fId;
    } else {
        returnCode = false;
    }
    return;
}

/* SEND GIFT */
function fieldValidateGiftForm(fObj, frmId) {
	var fId = $(fObj).attr('id');
	var fVal = $.trim($(fObj).val());

	switch(fId) {
    	case "giftToEmail":
    		valid=wr6_isEmail(fVal);
            if(errTest = (!valid)?1:0) break;
    		break;

    	case "giftTo":
			valid=wr6_minLength(fVal,1);
			if(errTest = (valid)?1:0) break;
    		break;

			valid=wr6_maxLength(fVal,100);
			if(errTest = (valid)?1:0) break;
    		break;

    	case "giftFrom":
			valid=wr6_minLength(fVal,1);
			if(errTest = (valid)?1:0) break;
    		break;

			valid=wr6_maxLength(fVal,100);
			if(errTest = (valid)?1:0) break;
    		break;

    	case "giftMessage": // TODO check for < >
			valid=wr6_minLength(fVal,1);
			if(errTest = (valid)?1:0) break;

			valid=wr6_maxLength(fVal,500);
			if(errTest = (valid)?1:0) break;
    		break;
    		
		default:
			break;
    }
    if(errTest!=-1) {
        returnCode = errMessage(fObj,errTest,frmId);
        errorField = fId;
    } else {
        returnCode = false;
    }
    return;
}

/* EMAIL DEAL */
function fieldValidateEmailForm(fObj, frmId) {
	var fId = $(fObj).attr('id');
	var fVal = $.trim($(fObj).val());
	
	switch(fId) {
    	case "sendTo": 
    		valid=multiEmailValidate(fVal);
			if(errTest = (!valid)?2:0) break;
    		//valid=wr6_isEmail(fVal);
            //if(errTest = (!valid)?1:0) break;
    		break;

    	case "sendFrom":
    		valid=wr6_isEmail(fVal);
            if(errTest = (!valid)?1:0) break;

			valid=wr6_maxLength(fVal,100);
			if(errTest = (valid)?1:0) break;
    		break;

    	case "message":
			valid=wr6_minLength(fVal,1);
			if(errTest = (valid)?1:0) break;

			valid=wr6_maxLength(fVal,500);
			if(errTest = (valid)?1:0) break;
    		break;
    		
		default:
			break;
    }
    if(errTest!=-1) {
        returnCode = errMessage(fObj,errTest,frmId);
        errorField = fId;
    } else {
        returnCode = false;
    }
    return;
}

function selectFieldValidate(fObj, frmId) {
		fieldValidate($('#'+fObj), frmId);
		return;
}

function fieldValidate(fObj, frmId) {
	var fId = $(fObj).attr('id');
	var fVal = $.trim($(fObj).val());
    errTest=-1;
    
    switch(fId) {
		/* REG/PAY */
        case "firstName":
            injectErrInLabel = true;

			valid=wr6_minLength(fVal,1);
			if(errTest = (valid)?4:0) break;

			valid=wr6_maxLength(fVal,15);
			if(errTest = (valid)?3:0) break;

			valid=wr6_isSpecialChars(fVal);
			if(errTest = (!valid)?5:0) break;

			valid=wr6_isAlpha(fVal);
			if(errTest = (valid)?0:1) break;
			/*If we do this, it will be copied when you submit the form...
			if ($('#firstNameOnCard')) 
				$('#firstNameOnCard').val(fVal);		
			*/	
			break;

		case "lastName":
			injectErrInLabel = true;

			valid=wr6_minLength(fVal,2);
			if(errTest = (valid)?4:0) break;

			valid=wr6_maxLength(fVal,15);
			if(errTest = (valid)?3:0) break;

			valid=wr6_isSpecialChars(fVal);
			if(errTest = (!valid)?5:0) break;

			valid=wr6_isAlpha(fVal);
			if(errTest = (valid)?0:1) break;

			/*If we do this, it will be copied when you submit the form...
			if ($('#lastNameOnCard')) 
				$('#lastNameOnCard').val(fVal);	
			*/
			break;
		case "email":

			valid=wr6_isEmail(fVal);
			if(errTest = (!valid)?4:0) break;

			valid=wr6_maxLength(fVal,45);
			if(errTest = (valid)?3:0) break;

			injectErrInLabel = true;
			result=false;
			var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
			
			if(submtChkoutFrm) {
				submtChkoutFrm=false;
				checkLoginId(fVal,'0', frmId, false, function(result) {
					$('#'+frmId).find('#'+fId).removeClass('snCheckProcessing');
					if(result != true)
					{
						errTest = (result != true)?result:0;
						snsLoginId = fVal;
						if(!is_chrome)
						{
							$('#loginAol').click();
						}
					}
					else
					{
						errTest = 0;
					}
				});
			} else {
				checkLoginId(fVal,'0', frmId, true, function(result) {
					$('#'+frmId).find('#'+fId).removeClass('snCheckProcessing');
					if(result != true) {
						returnCode = errMessage(fObj,result,frmId);
			            errorField = fId;
			            errTest = 0;
						snsLoginId = fVal;
						if(!is_chrome)
						{
							$('#loginAol').click();
						}
					} else {
						errTest = 0;
					}
				});
			}
			
			break;

		case "confirmEmail":
			injectErrInLabel = true;
			valid=wr6_compareStringsNoCase($.trim($('#'+frmId).find('#email').val()),fVal);
			errTest = (!valid)?102:0;

			break;

		case "password":
			injectErrInLabel = true;

			valid=wr6_minLength(fVal,6);
			if(errTest = (valid)?1:0) break;

			valid=wr6_maxLength(fVal,16);
			if(errTest = (valid)?1:0) break;

			try {
			  valid=wr6_compareStrings($.trim($('#'+frmId).find('#email').val()),fVal);
			  if(errTest = (valid)?103:0) break;

			  valid = wr6_hasSingleCharacterDiff($.trim($('#'+frmId).find('#email').val()),fVal);
			  if(errTest = (!valid)?103:0) break;

			  compareSubLen = 4;
			  valid = wr6_compareSNandPassword($('#'+frmId).find('#email').val(),fVal,compareSubLen);
			  if(errTest = (!valid)?103:0) break;

			} catch(err) {
			  //No firstName on the form
			}

			try {
			  valid = wr6_comparePassName($('#'+frmId+' #firstName').val(),$('#'+frmId+' #lastName').val(),fVal);
			  if(errTest = (!valid)?103:0) break;
			} catch(err) {
			  //No firstName on the form
			}

			break;

		case "verifyPassword":
			injectErrInLabel = true;

			valid=wr6_compareStrings($.trim($('#'+frmId+' #password').val()),fVal);
			errTest = (!valid)?102:0;

			break;

		case "expMonth":
			injectErrInLabel = true;
			if($('#'+frmId+' #expYear').val() == '') break;

			valid = wr6_checkDate(fVal,$('#'+frmId+' #expYear').val(),new Date());
			if(errTest = (!valid)?201:0) break;
			break;

		case "expYear":
			injectErrInLabel = true;
			valid = wr6_checkDate($('#'+frmId+' #expMonth').val(), fVal,new Date());
			if(errTest = (!valid)?201:0) break;
			break;
			
		case "firstNameOnCard":
			injectErrInLabel = true;

			valid=wr6_minLength(fVal,1);
			if(errTest = (valid)?4:0) break;

			valid=wr6_maxLength(fVal,15);
			if(errTest = (valid)?3:0) break;

			valid=wr6_isAlpha(fVal);
			if(errTest = (valid)?0:1) break;
			
			valid=wr6_nameSpecialChars(fVal);
			if(errTest = (!valid)?5:0) break;

			break;
			
		case "lastNameOnCard":
			injectErrInLabel = true;

			valid=wr6_minLength(fVal,2);
			if(errTest = (valid)?4:0) break;

			valid=wr6_maxLength(fVal,15);
			if(errTest = (valid)?3:0) break;

			valid=wr6_isAlpha(fVal);
			if(errTest = (valid)?0:1) break;
			
			valid=wr6_nameSpecialChars(fVal);
			if(errTest = (!valid)?5:0) break;

			break;

		case "billToAddress1":
			injectErrInLabel = true;

			valid=wr6_minLength(fVal,1);
			if(errTest = (valid)?1:0) break;

			valid=wr6_maxLength(fVal,30);
			if(errTest = (valid)?3:0) break;

			valid=wr6_addressSpecialChars(fVal);
			if(errTest = (!valid)?5:0) break;
			break;

		case "billToCity":
			injectErrInLabel = true;

			valid=wr6_minLength(fVal,3);
			if(errTest = (valid)?1:0) break;

			valid=wr6_maxLength(fVal,30);
			if(errTest = (valid)?3:0) break;
			
			valid=wr6_isAlpha(fVal);
			if(errTest = (valid)?0:6) break;

			valid=wr6_isSpecialChars(fVal);
			if(errTest = (!valid)?5:0) break;
			break;
			
		case "billToStateProvinceGeoId":
			injectErrInLabel = true;

			valid=wr6_minLength(fVal,1);
			if(errTest = (valid)?1:0) break;
			break;

		case "billToPostalCode":
			injectErrInLabel = true;

			valid=wr6_minLength(fVal,5);
			if(errTest = (valid)?2:0) break;

			valid=wr6_countrySpecificCheckZip(fVal);
			if(errTest = (valid)?101:0) break;

			break;
			
		case "cardType":
			injectErrInLabel = true;
			
			valid=wr6_minLength(fVal,1);
			if(errTest = (valid)?1:0) break;

			//choose which TOS text on checkout pages to display based on whether DEBIT is selected or not
			showCreditDebitCopy(fVal);
			break;

		case "cardNumber":
			injectErrInLabel = true;

			valid=wr6_minLength(fVal,5);
			if(errTest = (valid)?2:0) break;

			//if(errTest = wr6_payTypeSelect()) break;
			
			if(wr6_payTypeSelect()) {
				errTest = 1;
				var fId = "cardType";
				var fObj = $('#'+fId);
				break;
			}

			valid = wr6_isValidCCNum(fVal);
			if(errTest = (!valid)?202:0) break;

			errTest = wr6_validateCC(fVal);
			break;

		case "cardSecurityCode":
			injectErrInLabel = true;

			  valid=wr6_maxLength(fVal,4);
			  if(errTest = (valid)?4:0) break;

			valid=wr6_isInt(fVal);
			if(errTest = (!valid)?101:0) break;

			if(!nonValidCardType()) {
				lngthNum = ($('#'+frmId+' #expMonth').val()=="americanexpress")?4:3;
				valid=wr6_minLength(fVal,lngthNum);
				if(errTest = (valid)?4:0) break;
			}
			break;
			
		case "iagree":
			injectErrInLabel = true;
			if($("#"+fId).is(":visible")) {
				valid=(fVal.toLowerCase()=='i agree')
				if(errTest = (!valid)?1:0) break;
			}

			break;

		default:
			break;
	}

    if(errTest!=-1) {
        returnCode = errMessage(fObj,errTest,frmId);
        errorField = fId;
    } else {
        returnCode = false;
    }
    return;
}

function wr6_hasSingleCharacterDiff(string1,string2) {
	string1 = string1.toLowerCase();
	string2 = string2.toLowerCase();
	for(var _i=0;_i<string2.length;_i++) {
		if(string1.indexOf(string2.charAt(_i))==-1) return true;
	}
	return false;
}
function wr6_compareSNandPassword (screenname,password,subLen) {
  screenname = screenname.toLowerCase();
  password = password.toLowerCase();
  snLen = screenname.length;
  pwLen = password.length;
  snLessLen = snLen - subLen;
  pwLessLen = pwLen - subLen;
  for (i=0;i<snLessLen;i++) {
      iPlusLen = i + subLen;
      snSnip = screenname.substring(i,iPlusLen);

      for (j=0;j<pwLessLen;j++) {
          jPlusLen = j + subLen;
          pwSnip = password.substring(j,jPlusLen);
          if (pwSnip == snSnip) {
              return 0;
          }
      }
  }
  return 1;
}
function wr6_comparePassName(firstName,lastName,password) {
    if ((firstName.length >= 4 && password.match(firstName)) || (lastName.length >= 4 && password.match(lastName))) {
        return 0;
    }
    return 1;
}
function wr6_checkDate(mm,yy,nDate) {
	if(!mm.length || !yy.length) return 0;
	mDate = new Date(yy, mm - 1, 31, 00);
	if(mDate<nDate) return 0;
	return 1;
}

function wr6_compareStrings(str1,str2) {
	if(str1 == str2) return 1;
	return 0;
}

function wr6_compareStringsNoCase(str1,str2) {
	str1 = str1.toLowerCase();
	str2 = str2.toLowerCase();
	if(str1 == str2) return 1;
	return 0;
}

function wr6_indexIsAlpha(index,str) {
	return wr6_isAlpha(str.charAt(index));
}

function wr6_charAtIsArg(str,chr,index) {
	if(str.charAt(index) == chr) return true;
	return false;
}

function wr6_compareArgToCharAt(str,chr,index,compOp) {
	if(eval("str.charAt(index)" + compOp + "chr")) return 1;
	return 0;
}

function wr6_compareSubStrings(str1,str2,sublen) {
	if(str1.substring(0,sublen) == str2.substring(0,sublen)) return 1;
	return 0;
}

function wr6_validateCC(number) {
	number = number.replace(/[^0-9]/g,"");

	var cardType = d.getElementById('cardType').value;
	cardType = cardType.toLowerCase();
	if(cardType == "aol visa") cardType = "visa";
	switch(cardType) {
		case "visa":
		case "visadebit":
			if(!wr6_charAtIsArg(number,"4",0)) return 212;
			if(number.length != 13 && number.length != 16)return 216;
			break;
		case "mastercard":
		case "mastercarddebit":
			if(!wr6_charAtIsArg(number,"5",0) && (!wr6_compareArgToCharAt(number,"1",1,"<") || !wr6_compareArgToCharAt(number,"4",1,">"))) return 211;
			if(number.length!=16) return 215;
			break;
		case "americanexpress":
			if(!wr6_charAtIsArg(number,"3",0) || !wr6_charAtIsArg(number,"4",1) && !wr6_charAtIsArg(number,"7",1)) return 213;
			if(number.length!=15) return 217;
			break;
		case "discover":
			if(!wr6_subStringMatch(number,0,4,"6011")) return 214;
			if(number.length!=16) return 218;
			break;
		case "diners card":
			if(!wr6_subStringMatch(number,0,2,"30") && !wr6_subStringMatch(number,0,2,"36") && !wr6_subStringMatch(number,0,2,"38")) return 220;
			if(number.length != 14) return 219;
			break;
		case "sears":
			if(number.length <= 8) return 240;
			break;

	}

	cs = wr6_ccCheckSum(number);
	if(cs!=0) return 230;
	return 0;
}

function wr6_ccCheckSum(number) {
	total=0;
	tmp=0;
	for(var loc = number.length - 2; loc >= 0; loc -= 2) {
		total += 1 * number.charAt(loc +1);
		tmp = number.charAt(loc) * 2;
		if(tmp > 9) total += 1;
		total += tmp%10;
	}
	if(number.length % 2 > 0) total += 1 * number.charAt(0);
	return total % 10;
}

function nonValidCardType() {
    if(d.getElementById('cardType').value.toUpperCase() == "SEARS" || d.getElementById('cardType').value.toUpperCase() == "DINERS CARD") return 1;
    return 0;
}

function wr6_payTypeSelect() {
	if(d.getElementById('cardType').value=='') return 1;
	return 0;
}

function wr6_isAlpha(str) {
	if(str.search(/([0-9])/g) == -1) return 1;
	return 0;
}

function wr6_isValidCCNum(str) {
	str = str.replace(/ /g,"");
	if(str.search(/[^0-9 \-]/g)>-1)return 0;
	return 1;
}

function wr6_isInt(str) {
	if(str.search(/[^0-9]/g)>-1)return 0;
	return 1;
}

function wr6_subStringMatch(str,start,length,substr) {
	if(str.substring(start,length) == substr) return 1;
	return 0;
}

function wr6_minLength(str,length) {
    if(str.length<length)return 1;
	return 0;
}

function wr6_maxLength(str,length) {
	if(str.length>length)return true;
	return 0;
}

function wr6_isEmail(str) {
	var pattern='';
	//if (str.match(' ')) return 0;
	//pattern = /^(?:[\w\!\#\$\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/;
	//temp till sns is fixed
	pattern = /^(?:[\w\#\-]+\.)*[\w\#\-\.]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/;
	if (str.match(pattern)) {
		return 1;
	} else {
		return 0;
	}
}

function wr6_isBlankCharacter(str) {
    if(str.search(/[\s]/) == -1) return 1;
	return 0;
}

function wr6_isSpecialChars(str) {
    if(str.search(/[^ a-zA-Z\d]/) == -1) return 1;
	return 0;
}

function wr6_addressSpecialChars(str) {
    var pattern=/([^\Q+-.# \Ea-zA-Z0-9]+)/;
    if(!pattern.test(str)){
        return 1;
    }else{
        return 0;
    }
}

function wr6_nameSpecialChars(str) {
    var pattern=/([\\\+\*\?\$\[\]\(\)\|\{\}\/\#&^!@%=<>'"]+)/;
    if(!pattern.test(str)){
        return 1;
    }else{
        return 0;
    }
}

function wr6_zipCheck(str) {

    if(str.search(/^\d{5}$|^\d{5}-\d{4}$/) == -1) return 1;
	return 0;
}

function wr6_trimString(str) {
	return str.replace(/ /g,"");
}

//Returns the explicit label bound to the form element's id'
function getLabelObject(id){
    labelElements = d.getElementsByTagName("LABEL");
    for (var i=0; i<labelElements.length; i++){
        var forAttribute = labelElements[i].getAttribute("FOR");
        if (forAttribute == null){
            forAttribute = labelElements[i].attributes['for'].nodeValue;
        }
        if (forAttribute == id){
            return labelElements[i];
        }
    }
    return null;
}

////Login AJAX Check////////
function checkLoginId(snValue,wch,frmId, ajaxCallType,callback) {
	var snObj=$('#'+frmId).find('#email');

    if(wch=='1' || wch=='2' || wch=='3') {
	    cleanErrMessages();
        if(wch=='1') {
            $(snObj).val() = snValue;
            $('#'+frmId+' password').focus();
        } else {
            $(snObj).val()='';
            $(snObj).focus();
        }
        return;
    }
    $(snObj).addClass('snCheckProcessing');

	$.ajax({
		type: "GET",
		url: '/checkLoginExists',
		data: "s=" + encodeURIComponent(snValue),
		dataType: "text/html",
		timeout:8000,
		async:ajaxCallType,
		success: function(html){
			if (html.match('emailValid')) {
				$(snObj).css('border-color', '#c2c2c2');
				cleanErrMessages();
				callback(1);
			} else {
				$(snObj).css('border-color', '#cc0000');
				snCheckedOnce=true;
				callback(html);
			}
		},
		error:function(html){
			callback(0);
		}
	});
}


function intSNValidate(snValue) {

    valid=wr6_minLength(snValue,6);
    if(valid) return 1;

    valid=wr6_maxLength(snValue,35);
    if(valid) return 3;

    //Strip out whitespace before sending to check special chars
    //snNoSpace = snValue.replace(" ", "");
    valid = wr6_isBlankCharacter(snValue);
    if(!valid) return 5;

	valid=wr6_isEmail(snValue);
	if(!valid) return 4;

    return 0;
}


function errorLabelInjection(errMess, labelId, frmObjId) {
	try {
		doneLabelText=d.createTextNode("ERROR!  "+errMess);
		doneLabelSpan = d.createElement('<span class="hiddenError"></span>');
	} catch (e) {
		doneLabelText=d.createTextNode("ERROR!  "+errMess);
		doneLabelSpan = d.createElement("span");
		doneLabelSpan.setAttribute('class', 'hiddenError');
	}
	doneLabelSpan.appendChild(doneLabelText);
	if (injectErrInLabel) $('#'+frmObjId).find('label[for="'+labelId+'"]').append(doneLabelSpan);
return;
}

function snErrMessage(inpObj,errMess,frmObjId) {
var inpObjId = $(inpObj).attr('id');

    try {
		$('span').remove('.hiddenError');
		errors=false;
		if(errMess!='') {
			fieldError = "on";
			throwErr(inpObjId,errMess,frmObjId);
			errors=true;
		} else {
			fieldError = "off";
			//$('#'+frmObjId+' #'+inpObjId).css('border-color', '#c2c2c2');
			$('#'+frmObjId).find('#'+inpObjId).css('border-color', '#c2c2c2');
			throwErr(0, 0);
		}

    } catch (error) {
        if(debug)alert('error: '+error.message);
    }
	return errors;
}


function errMessage(inpObj,rule,frmObjId) {
var inpObjId = $(inpObj).attr('id');
var ruletype = typeof rule;
if(ruletype == 'string') {return snErrMessage(inpObj,rule,frmObjId);}

var labelObjId = (inpObjId=="expYear")?"expMonth":inpObjId;
var errMess="";
var isSelectObj = false;

    try {
        if((!err[inpObjId] || !err[inpObjId][rule]) && (rule!=0 && rule!=null)) {
            alert("There is a problem with your information. Please double check what you have entered.\n\nError " + rule + " [ " + inpObjId + " ]");
        } else {
            if(rule) { errMess = err[inpObjId][rule]; }

			if($(inpObj).get(0).tagName=='SELECT' == true) {
				isSelectObj = true;
				currDobContObj = inpObjId+'_custom';
				if(rule==0) {
					if(inpObjId=="expYear" || inpObjId=="expMonth") {
						checkDate = wr6_checkDate($('#expMonth').val(),$('#expYear').val(),new Date());
						if(checkDate) $('#expMonth_custom, #expYear_custom').css('border-color', '#d9d9d9');
					} else {
						$('#'+inpObjId+'_custom').css('border-color', '#d9d9d9');
					}
				}
				var selErrMessId = inpObjId;
			}
            
            if(snCheckedOnce) {snCheckedOnce=false;return;}

            if(rule!=0) {
                fieldError = "on";
            } else {
                fieldError = "off";
                if(!isSelectObj) inpObj.style.border='1px solid #c2c2c2';
                throwErr(0, 0);
            }

            palt=(rule==0)?err['tooltipTexts'][2]:err['tooltipTexts'][1];

            $('span').remove('.hiddenError');
            errors=false;
            if(rule) {
                //errorLabelInjection(errMess, labelObjId, frmObjId);
				if (isSelectObj) {
					throwSelectErr(selErrMessId, currDobContObj, errMess);
				} else {
					throwErr(inpObjId,errMess,frmObjId);
				}
                errors=true;
            }
        }

    } catch (error) {
        if(debug)alert('error: '+error.message);
    }
	return errors;
}

function throwSelectErr(lastElmId, currElmId, errMsg) {
		/*
		var errObj = $(".errCont, .error, .errSpan");
		$(errObj).slideUp('fast');
		*/
		if(errMsg) {
			cleanErrMessages();
			var errorElem = $('#'+currElmId);
			$(errorElem).css('border-color', '#cc0000');
			var errMid = $(d.createElement('div')).addClass('errMid').html('<p class="errorPara">'+errMsg+'</p>');
			var errCont = $(d.createElement('div')).addClass('errCont');
			errCont.append(errMid).fadeIn();
			var writeErr;
			if ($(errorElem).parents('td:eq(0)').length) {
				setTimeout(function() {
					cleanErrMessages();
					writeErr = $(errorElem).parents('td:eq(0)').append(errCont);
				}, 40);
			} else {
				setTimeout(function() {
					cleanErrMessages();
					writeErr = $(errorElem).after(errCont);
				}, 40);
			}
			if($('.errorPara').is(':empty')) $('.errorPara').remove();
		} else if(errMsg==null) {
				$(errorElem).css('border-color', '#cc0000');
		}
		return;
}

function throwErr(elmId, errMsg, frmObjId) {

	/*var errObj = $(".errCont, .error, .errSpan");
	$(errObj).slideUp('fast');
	*/
	if(errMsg) {
		cleanErrMessages();
		var errorElem = $('#'+frmObjId).find('#'+elmId);
		if($(errorElem).get(0).tagName=='SELECT' == false) $(errorElem).css('border-color', '#cc0000');
		var errMid = $(d.createElement('div')).addClass('errMid').html('<p class="errorPara">'+errMsg+'</p>');
		var errCont = $(d.createElement('div')).addClass('errCont');
		errCont.append(errMid).fadeIn();
		var writeErr;
		if ($(errorElem).parents('td:eq(0)').length) {
			setTimeout(function() {
				cleanErrMessages();
				writeErr = $(errorElem).parents('td:eq(0)').append(errCont);
			}, 40);
		} else {
			setTimeout(function() {
				cleanErrMessages();
				writeErr = $(errorElem).after(errCont);
			}, 40);
		}
		if (!$('.errorPara').text() || $('.errorPara').text().trim() == "") $('.errorPara').remove();
		if($('.errorPara').is(':empty')) $('.errorPara').remove();
	}
return;
}

function cleanErrMessages() {
	//$('#purchaseDeal').removeClass('purchaseDeal-process');
	var errObj = $(".errCont, .error");
	$(errObj).remove();
	return;
}


function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

/* NEW METHODS FOR DOD */


/*ADD FUNCTION TO PAGE...MAYBE AT THE BOTTOM OF THE FILE WITH THE OTHER HELPER FUNCTIONS*/
function cleanMeUp(str, chars) {
	return str.replace(new RegExp('[' + chars + ']', 'gi'), '');
}

/*ADD THIS TO SWITCH CASE FOR COMMENT FIELD ID...MAYBE AFTER THE TRIM FUNCTION*/
/*THE SECOND VAR IS THE CHARACTERS THAT YOU WANT TO REMOVE. 
THIS IS A REGEX, SO ESCAPE CHARACTERS THAT NEED IT*/
/*
fObj.value = cleanMeUp(fObj.value, '<>');
*/


/*ADD THESE TWO FUNCTIONS TO PAGE*/
function isValidEmail(str) {
	var pattern='';
	if(str.match(' ')) return 0;
	pattern = /^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/;
	return (str.match(pattern))?1:0;
}

function multiEmailValidate(addys) {
	if(!addys.length) return;
	var email = addys.split(',');
	for (var i=0; i<email.length; i++) {
		if(!isValidEmail($.trim(email[i]))) return 0;
	}
	return 1;
}

/*ADD THIS TO SWITCH CASE FOR ID CONTAINING THE MULTIPLE EMAILS*/
/*
valid=multiEmailValidate(fObj.value);
if(errTest = (!valid)?4:0) break;
*/

/*Script for validation of UK post codes*/
/*==============================================================================

Application:   Utility Function
Author:        John Gardner

Version:       V1.0
Date:          18th November 2003
Description:   Used to check the validity of a UK postcode

Version:       V2.0
Date:          8th March 2005
Description:   BFPO postcodes implemented.
               The rules concerning which alphabetic characters are allowed in 
               which part of the postcode were more stringently implementd.
  
Version:       V3.0
Date:          8th August 2005
Description:   Support for Overseas Territories added                 
  
Version:       V3.1
Date:          23rd March 2008
Description:   Problem corrected whereby valid postcode not returned, and 
							 'BD23 DX' was invalidly treated as 'BD2 3DX' (thanks Peter 
               Graves)        
  
Version:       V4.0
Date:          7th October 2009
Description:   Character 3 extended to allow 'pmnrvxy' (thanks to Jaco de Groot)          
              
  
Parameters:    toCheck - postcodeto be checked. 

This function checks the value of the parameter for a valid postcode format. The 
space between the inward part and the outward part is optional, although is 
inserted if not there as it is part of the official postcode.

If the postcode is found to be in a valid format, the function returns the 
postcode properly formatted (in capitals with the outward code and the inward
code separated by a space. If the postcode is deemed to be incorrect a value of 
false is returned.
  
Example call:
  
  if (checkPostCode (myPostCode)) {
    alert ("Postcode has a valid format")
  } 
  else {alert ("Postcode has invalid format")};
                    
------------------------------------------------------------------------------*/

function checkPostCode (toCheck) {

  // Permitted letters depend upon their position in the postcode.
  var alpha1 = "[abcdefghijklmnoprstuwyz]";                       // Character 1
  var alpha2 = "[abcdefghklmnopqrstuvwxy]";                       // Character 2
  var alpha3 = "[abcdefghjkpmnrstuvwxy]";                         // Character 3
  var alpha4 = "[abehmnprvwxy]";                                  // Character 4
  var alpha5 = "[abdefghjlnpqrstuwxyz]";                          // Character 5
  
  // Array holds the regular expressions for the valid postcodes
  var pcexp = new Array ();

  // Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA
  pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
  
  // Expression for postcodes: ANA NAA
  pcexp.push (new RegExp ("^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));

  // Expression for postcodes: AANA  NAA
  pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "{1}" + "?[0-9]{1}" + alpha4 +"{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
  
  // Exception for the special postcode GIR 0AA
  pcexp.push (/^(GIR)(\s*)(0AA)$/i);
  
  // Standard BFPO numbers
  pcexp.push (/^(bfpo)(\s*)([0-9]{1,4})$/i);
  
  // c/o BFPO numbers
  pcexp.push (/^(bfpo)(\s*)(c\/o\s*[0-9]{1,3})$/i);
  
  // Overseas Territories
  pcexp.push (/^([A-Z]{4})(\s*)(1ZZ)$/i);

  // Load up the string to check
  var postCode = toCheck;

  // Assume we're not going to find a valid postcode
  var valid = false;
  
  // Check the string against the types of post codes
  for ( var i=0; i<pcexp.length; i++) {
    if (pcexp[i].test(postCode)) {
    
      // The post code is valid - split the post code into component parts
      pcexp[i].exec(postCode);
      
      // Copy it back into the original string, converting it to uppercase and
      // inserting a space between the inward and outward codes
      postCode = RegExp.$1.toUpperCase() + " " + RegExp.$3.toUpperCase();
      
      // If it is a BFPO c/o type postcode, tidy up the "c/o" part
      postCode = postCode.replace (/C\/O\s*/,"c/o ");
      
      // Load new postcode back into the form element
      valid = true;
      
      // Remember that we have found that the code is valid and break from loop
      break;
    }
  }
  
  // Return with either the reformatted valid postcode or the original invalid 
  // postcode
  if (valid) {return postCode;} else return false;
}

