/* iOffer INLINE ERROR CHECKING */
/*
[error_count] keeps arunning count of the errors in each form generated by these fn's
[errors] is an array which is set on each form page that lists the ids of the elements to be verified
[error_values] is a list of values to check against, used primarily for re-verifying AJAX-verified fields at submit
*/ 
var error_style			= "";
var error_count			= 0;
var errors				= new Array();
var error_values		= new Array();
var errors_anchor		= "form_errors_anchor"; //=> Needs to be set on the calling page; determines where the error summary is displayed
var submit_but			= "submit_but";			//=> Needs to be set on the calling page; the id of the submit button for this form
var submit_but_on		= "/images/buttons/btn_submit_lg.gif";
var submit_but_off		= "/images/buttons/btn_submit_lg_off.gif";
var indicator_id		= "activityind_";
var validator;
var id;
var errid;
var errdiv;
var errtext;
var errkey;
var errlabel;
var errstar;
var errtype;
/*
[validator/validate_type]	=> illegal_chars, is_num, is_price, etc
[val]						=> element id/string/number to validate
[param]						=> parameter/criteria to validate against
[id/inputid]				=> the id of the element to check
[errid]						=> unique id for the error display (eg, "is_cc_num_err_id_credit_card_cc_no")
[erdiv]						=> container div for the error display
[errlabel]					=> input label to turn green/red on success/failure
[errstar]					=> "required" * (asterick) to turn green/red on success/failure
[errtext/errortext]			=> text to display to the user
[errtype/errortype]			=> div/label/star/all
*/
/* VALIDATION FUNCTIONS */
function checkValid(validate_type, val, param, inputid, errortext, errortype) {
	validator = validate_type;
	id = inputid;
	errid = validator + "_err_id_" + id;
	errdiv = "feedback_" + id;
	errlabel = "label_" + id;
	errstar = "required_icon_" + id;
	
	errtext = errkey = errortext;
	if (I18n.has_translation(errortext)) {
	  errtext = I18n.t(errkey);
	}
	
	errtype = errortype;
	
	if (validate_type == "illegal_chars") {
		if (!val.match(param)) deleteError();
		else setUpError();
	} else if (validate_type == "is_num_characters_less_than") {
		if (val.length > param) setUpError();
		else deleteError();
	} else if (validate_type == "is_num") {
		if (!isNaN(val) && val != "") deleteError();
		else setUpError();
	} else if (validate_type == "is_price") {
		if (!isNumberAPrice(val)) setUpError();
		else deleteError();
	} else if (validate_type == "is_price_realistic") {
		if (!isNumberAPrice(val) || isNumberTooLow(val,param) || (parseInt(val) == 0)) setUpError(); // removed condition: || isNumberTooHigh(val,param); added || (parseInt(val) == 0)
		else deleteError();
	} else if (validate_type == "is_price_non_zero") {
		if (param != "" && (!isNumberAPrice(val) || val == "0" || val == "0.0" || val == "0.00")){
  		setUpError();
		}else{
      deleteError();
		}
	} else if (validate_type == "is_price_realfifty") {
		if (!isNumberAPrice(val) || (parseInt(val) == 0)) setUpError(); // removed condition: || isNumberTooHigh(val,param); changed (val == 0) to (parseInt(val) == 0)
		else deleteError();
	} else if (validate_type == "is_cc_num") {
		if (isNaN(val) || (val+'').length < 13 || (val+'').length > 16) setUpError();
		else deleteError();
	} else if (validate_type == "is_email") {
		var emailFilter = /^.+@.+\..{2,4}$/;
		var illegalChars = /[\(\)\<\>\,\;\:\\\/\"\[\]]/
		/* make sure there's nothing bad in there, like (") */
		if (!(emailFilter.test(val))) setUpError();
		else {
			if (val.match(illegalChars)) {
				errtext = "The email address contains illegal characters.";
				setUpError();
			} else deleteError();
		}
	} else if (validate_type == "is_multi_email") {
		var emailFilter = /^.+@.+\..{2,3}$/;
		var illegalChars = /[\(\)\<\>\,\;\:\\\/\"\[\]]/
		/* make sure there's nothing bad in there, like (") */
		var email_list = val.split(" ");
		for (var elist = 0; elist < email_list.length; elist++) {
			if (!(emailFilter.test(email_list[elist]))) {
				setUpError();
				break;
			} else {
				if (email_list[elist].match(illegalChars)) {
					errtext = "One or more email addresses contain illegal characters.";
					setUpError();
					break;
				} else deleteError();
			}
		}
	} else if (validate_type == "is_phone") {
		var stripped = val.replace(/[\(\)\.\-\ ]/g, '');
		if (isNaN(parseInt(stripped))) {
			errtext = "The phone number contains illegal characters.";
			setUpError();
		} else {
			if (stripped.length < 10 || (val+'').length > 13) setUpError();
			else deleteError();
		}
	} else if (validate_type == "is_zip") {
		if (val.length == 0 || val.match(/^\s+$/) || val == param) setUpError();
		else deleteError();
	} else if (validate_type == "is_num_equal") {
		if ((isNaN(val) || val != param) && val != "") setUpError();
		else deleteError();
	} else if (validate_type == "is_num_less_than") {
		if (isNaN(val) || val > param || val == "" || val == "0") setUpError();
		else deleteError();
	} else if (validate_type == "is_drop_null") {
		if (val != param && val != "") deleteError();
		else setUpError();
	} else if (validate_type == "is_field_empty") {
		if (val.length == 0 || val.match(/^\s+$/) || val == param) setUpError();
		else deleteError();
	} else if (validate_type == "is_num_length_equal") {
		if (isNaN(val) || ((val+'').length != param)) setUpError();
		else deleteError();
	} else if (validate_type == "is_num_length_less_than") {
		if (isNaN(val) || ((val+'').length > param) || val == "") setUpError();
		else deleteError();
	} else if (validate_type == "is_password") {
		// more requirements to follow...
		if (val.length < param || val.match(/[\W_]/) || val.length == 0) setUpError();
		else deleteError();
	} else if (validate_type == "is_confirmation_equal") {
		if (val != param || val.length == 0) setUpError();
		else deleteError();
	} else if (validate_type == "is_radio_checked") {
		errlabel = "label_" + param;
		errdiv = "feedback_" + param;
		errid = validator + "_err_id_" + param;
		if ($(id).checked) deleteError();
		else setUpError();
	} else if (validate_type == "is_radio_all_checked") {
		errlabel = "label_" + param;
		errdiv = "feedback_" + param;
		errid = validator + "_err_id_" + param;
		var isChecked = false;
		for(var i = 0; i < val.length; i++){
		    if($(val[i]).checked == true){
		        isChecked = true;
		    }
		}
		if(isChecked){
		    deleteError();
		}else{
            setUpError();
		}
	} else if (validate_type == "is_checkbox_at_least_one_checked") {
		errlabel = "label_" + param;
		errdiv = "feedback_" + param;
		errid = validator + "_err_id_" + param;
		var isChecked = false;
		var checkboxArray = val.split(",");
		
		for(var i = 0; i < checkboxArray.length; i++){
		    while(checkboxArray[i].indexOf(" ") > -1){
                checkboxArray[i].chop();
		    }
		
		    if($(checkboxArray[i]).checked == true){
		        isChecked = true;
		    }
		}
		if(isChecked){
		    deleteError();
		}else{
            setUpError();
		}
	} else if (validate_type == "is_ajax_error") {
		if (param == "true") setUpError();
		else deleteError();
	} else if (validate_type == "is_combo_req_fulfilled") {
		var selectedCount = 0;
		checker = eval(param);
		//alert(param+', '+param.length);
		for (var i = 0; i < checker.length; i++) {
			if (checker[i].checked) {
				selectedCount++;
			}
		}
		if (selectedCount < 1 && (val.replace(/^\s+/g, '').replace(/\s+$/g, '') == "")) {
			$(inputid).value = selectedCount; //focus();
			setUpError();
		} else {
			deleteError();
		}
	}
	
	
	if (submit_but) checkValidity();
}

function setUpError() {
	if (errtype == "all") {
		invalidateLabel();
		invalidateAsterick();
		createError();
	}
	if (errtype.indexOf("label") != - 1) invalidateLabel();
	if (errtype.indexOf("star") != -1) invalidateAsterick();
	if (errtype.indexOf("div") != -1) createError();
	if (!checkErrorPresent()) {
	   errors[errid] = "fail";
	   error_count++;
	}
	if ($('errorsinform')) {
		createErrorNotification();
	}
}

function isNumberTooLow(val,param) {
	if (param > 0 && val < (param/2)) return true
	else return false;
}

function isNumberTooHigh(val,param) {
	if (param > 0 && val > param) return true
	else return false;
}

function deleteError() {
	if (errtype == "all") {
		validateLabel();
		validateAsterick();
	}
	if (errtype.indexOf("label") != -1) validateLabel();
	if (errtype.indexOf("star") != -1) validateAsterick();
	//if (errtype.indexOf("div") != -1) deleteError();
	if (checkErrorPresent()) {
		if ($(errid)) {
			e = $(errid).parentNode;
			if (e) {
				new Effect.BlindUp(errid, { duration: 0.4, afterFinish:function() {
					if ($(errid) && $(e)){
					   e.removeChild(e.firstChild);
					}
				}});
			}
		}
		removeErrorFromList();
		error_count--;
	}
	checkFormWholeness();
}

function checkErrorPresent() {
	if (errors[errid] && errors[errid] == "fail") return true;
	else return false;
}

function removeErrorFromList() {
	if (errors[errid] && errors[errid] == "fail") errors[errid] = "pass";
}

function checkFormWholeness() {
	if ($('errorsinform')) {
		if (error_count < 1)  {
			deleteErrorNotification();
		} else {
			createErrorNotification();
		}
	}
}

function clearErrors() {
	if (error_count > 0)  {
		for (var i=0; i<errors.size(); i++) {
			deleteError();
		}
	}
}

/* INLINE ERROR MSG CREATION */
function createError() {
	// This is the div, td, span, etc that contains the empty element, errdiv
	// The container may be any DOM element that accepts appendChild,
	// and errdiv may be any element which can be indentified by id
	errorDiv = $(errdiv);
	//wrapperDiv = document.createElement('div');
	//wrapperDiv.setAttribute('id',errid);
	newError = document.createElement('p');
	newError.id = errid;
	classN = 'feedback-warn';
	if (error_style) classN = classN + ' ' + error_style;
	newError.setAttribute('class',classN);
	newError.setAttribute('className',classN);
	errtextSpan = document.createElement('span');
	errtextSpan.appendChild(document.createTextNode(errtext));
	newError.appendChild(errtextSpan);
	//wrapperDiv.appendChild(newError);
	//spacerDiv = document.createElement('div');
	//wrapperDiv.appendChild(spacerDiv);
	if (!$(errid)) {
		errorDiv.appendChild(newError);
		new Effect.BlindDown(errid, { duration: 0.4 });
	} else {
		errorDiv.replaceChild(newError,$(errid));
		new Effect.Shake(errid);
	}

  //Report error to SiteCatalyst
	var jsFormCheckError = errkey;
  var jsFormCheckValue = $(id).value;
  if($(id).getAttribute("type") == "checkbox"){
    jsFormCheckValue = ($(id).checked == false ? "unchecked" : "checked");
  }
  
	scSendData({prop35: jsFormCheckError, prop36: jsFormCheckError + " - " + s_obj.pageName, linkName: "Javascript Form Check Error", prop40: jsFormCheckError + " - (" + jsFormCheckValue + ")"}, "prop7,prop15,prop30,server,pageName", "", 500);
}

/* Creates an error notification if there are errors when the form is submitted */
function createErrorNotification() {
	errMess = I18n.t("form_contains_error_copy", { "count" : error_count });
	anchorDiv = $(errors_anchor);
	if (!anchorDiv) { return; }
	errorDiv = $(errors_anchor).parentNode;
	newError = document.createElement('p');
	newError.id = 'errorsinform';
	classN = 'feedback';
	if (error_style) classN = classN + ' ' + error_style;
	newError.setAttribute('class',classN);
	newError.setAttribute('className',classN);
	errtextSpan = document.createElement('span');
	errtextSpan.appendChild(document.createTextNode(errMess));
	newError.appendChild(errtextSpan);
	if (!$('errorsinform')) {
		errorDiv.appendChild(newError);
	} else {
		errorDiv.replaceChild(newError,$('errorsinform'));
	}
	disableSubmit();
}

/* LABEL/ASTERICK FUNCTIONS */
function invalidateLabel() {
	$(errlabel).className = "required ioffer-red";
}

var astericks = new Array();
astericks[0] = new Image();
astericks[0].src = "/images/icons/required_fail.gif";
astericks[1] = new Image();
astericks[1].src = "/images/icons/required_pass.gif";

function validateLabel() {
	$(errlabel).className = "required ioffer-green";
}

function invalidateAsterick() {
	eval("document.images."+errstar+".src = astericks[0].src");
}

function validateAsterick() {
	eval("document.images."+errstar+".src = astericks[1].src");
}

/* ENABLE/DISABLE SUBMIT BUTTON */
function checkValidity() {
	if (error_count == 0) enableSubmit();
	//else disableSubmit();
}

function disableSubmit() {
	if ($(submit_but)) {
		$(submit_but).src = submit_but_off;
		$(submit_but).disabled = false;
	}
}

function enableSubmit() {
	if ($(submit_but)) {
		$(submit_but).src = submit_but_on;
		$(submit_but).disabled = false;
	}
}

/* Deletes the form error notification. */
function deleteErrorNotification() {
	if ($('errorsinform')) {
		e = $('errorsinform').parentNode;
		if (e) {
			new Effect.BlindUp($('errorsinform'), { duration: 0.4, afterFinish:function() {
				if ($('errorsinform') && $(e)) e.removeChild($('errorsinform'));
			}});
		}
	}
}

/* Checks for errors in the fields when form is submited 
	@param theForm [optional] given to submit the form when there's no error
*/
function checkSubmit(theForm) {
	if (error_count > 0) {
		createErrorNotification();
		if ($(indicator_id)) Element.hide(indicator_id);
		return false;
	} else {
		deleteErrorNotification();
		if (theForm) { theForm.submit(); }
		return true;
	}
}

// STILL TO DO....
/**
* displayWaitMessage - Displays a wait msg when user submits the form
 */
function displayWaitMessage() {
	$('submit').setAttribute('disabled', 'disabled');
	
	node = $('submit').parentNode;
	
	msgDiv = document.createElement('div');
	msgDiv.setAttribute('id','wait');
	
	p = document.createElement('p');
	p.style.cssText = "padding-top:10px;";
	span = document.createElement('span');
	span.style.cssText = "margin-top: 4px;padding:1px; background:#FFFFDF;";
	msg = document.createTextNode("Saving information... ");
	
	var waitimg = document.createElement('img');
	waitimg.setAttribute('src', '/images/throbber.gif');
	waitimg.setAttribute('id', 'waitimg');
	waitimg.style.cssText = "position: relative; top: 5px; left: 8px;";
	
	span.appendChild(msg);
	p.appendChild(span);
	p.appendChild(waitimg);
	msgDiv.appendChild(p);
	
	node.appendChild(msgDiv);
	new Effect.Appear(msgDiv, { duration: 0.4 });
}

/**
* Check if field is still empty. If not delete error message.
 */
function checkEmpty(field, del) {
	if (field.value.length == 1 && !field.value.match(/^\s+$/)) {
		deleteError(del);
	}
}

function isNumberAPrice(str) {
	var isprice = /^\d+(\.\d{0,2})?$/;
	return isprice.test( str );
}