/* JS doc for custom validation (mainly signup)*/

/*
	TODO:
*/

var validate_str = new Array();

var email_regex = /^[a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i;
//add custom regexpression here and the array index as a parameter per field
var regex_ar = new Array(/^[a-zA-Z0-9_-]{2,}$/);

//format is ['input_name'] = "condition1-:-conidtion2-:-params1-:-params2"
validate_str['SignupFirstName'] = "required-:-VALID_NOT_EMPTY";
validate_str['SignupLastName'] = "required-:-VALID_NOT_EMPTY";
validate_str['SignupPhone'] = "required-:-VALID_LENGTH_GREATER-:-6";
validate_str['SignupEmail'] = 'required-:-VALID_EMAIL';
validate_str['SignupOfficePosition'] = "not_required-:-VALID_NOT_EMPTY";


//page 2
validate_str['SignupAddress'] = "required-:-VALID_NOT_EMPTY";
validate_str['SignupSuburb'] = "required-:-VALID_NOT_EMPTY";
validate_str['SignupState'] = "required-:-VALID_NOT_EMPTY";
validate_str['SignupPostcode'] = "required-:-VALID_NUMBER-:-VALID_LENGTH_MAX-:-4";

validate_str['SignupLots'] = "required-:-VALID_NUMBER-:-VALID_LENGTH_MAX-:-3";


validate_str['SignupBcNumber'] = "required-:-VALID_EXPRESSION-:-0";
validate_str['SignupAgentCode'] = "not_required-:-VALID_EXISTS";

validate_str['SignupAgentName'] = "required-:-VALID_NOT_EMPTY";
validate_str['SignupAgentSuburb'] = "required-:-VALID_NOT_EMPTY";
validate_str['SignupAgentState'] = "required-:-VALID_NOT_EMPTY";

//validate_str['SignupAgentPhone'] = "not_required-:-VALID_NOT_EMPTY";
//validate_str['SignupAgentContact'] = "not_required-:-VALID_NOT_EMPTY";
//validate_str['SignupBcName'] = "required-:-VALID_NOT_EMPTY";

//this was removed at some point!
//validate_str['SignupBcDescription'] = "not_required-:-VALID_NOT_EMPTY";

//page 3
validate_str['SignupAcceptTerms'] = "required-:-VALID_TRUE";



//-------------- owner signup
validate_str['AgentSignupName'] = "required-:-VALID_NOT_EMPTY";
validate_str['AgentSignupAbn'] = "required-:-VALID_NOT_EMPTY";
validate_str['AgentSignupContactName'] = "required-:-VALID_NOT_EMPTY";
validate_str['AgentSignupEmail'] = "required-:-VALID_EMAIL";
validate_str['AgentSignupPhone'] = "required-:-VALID_LENGTH_GREATER-:-6";
validate_str['AgentSignupAddress'] = "required-:-VALID_NOT_EMPTY";
validate_str['AgentSignupSuburb'] = "required-:-VALID_NOT_EMPTY";
validate_str['AgentSignupState'] = "required-:-VALID_NOT_EMPTY";
validate_str['AgentSignupPostcode'] = "required-:-VALID_NOT_EMPTY";
validate_str['AgentSignupPostalAddress'] = "not_required-:-VALID_NOT_EMPTY";
validate_str['AgentSignupPostalSuburb'] = "not_required-:-VALID_NOT_EMPTY";
validate_str['AgentSignupPostalState'] = "not_required-:-VALID_NOT_EMPTY";
validate_str['AgentSignupPostalPostcode'] = "not_required-:-VALID_NOT_EMPTY";







function init() {
	//show required fields

	var f = $('signup_form');
	if(f==null) {
		return;
	}
	f.onsubmit = validateAll;

	var el = null;
	
	var labs = document.getElementsByTagName('label');
	
	//get all tds with class of error_ico
	var error_cells = document.getElementsByClassName('error_ico');
	
	var count = 0;
	//print_r(labs);
	for (a in validate_str) {
		
		el = getE(a);
		if(el) {
			//alert(el);
			if(isRequired(validate_str[a])) {
				if(error_cells[count]) {
					error_cells[count].innerHTML += " *";
					el.className += ' required';
				}
				//alert('el.className: '+el.className);
			} else {
				//alert('not required');
			}
			count++;
		}
		
	}
	
	addValidationEvents();
	
}

var passed_elements =0;
var error_msg = 'Please correct the errors below.';
var checkbox_error = 'You must agree to the terms to continue.';
var override_validation = false;
var error_set = false;

var discount_code_is_valid = false;


function showAlert() {
	if(error_set) {
		return;
	}
	var el = getE('alert_error_display');
	el.style.visibility = 'visible';
	error_set = true;
	el.innerHTML += error_msg;
}

function hideAlert() {
	var el = getE('alert_error_display');
	el.style.visibility = 'hidden';
	error_set = false;
}

function validateAll() {
	
	if(override_validation) {
		return true;
	}
	
	var active_elements = 0;
	passed_elements = 0;
	for (a in validate_str) {
		var el = getE(a);
		if(el) {
			//onkeyup
			el.onchange();// = validateField;
			active_elements++;
			//console.log('checking element: '+el);
		}
	}
	if(active_elements==1) {
		error_msg = checkbox_error;
	}
	if(passed_elements==active_elements) {
		makeUpWebsiteName();
		return true;
	}
	showAlert();
	return false;
}

function makeUpWebsiteName() {
	var address = getE('SignupAddress');
	var nme = getE('SignupBcName');
	if(!address) return;
	
	nme.value = address.value + ' Body Corporate';
	
	
}

function validateField() {
	var el = this;
	//alert('field id: '+el.id);
	var vals_ar = getValidationRules(el.id);
	var output = '';
	var passed = true;
	
	var minChars = 2;
	
	//print_r(vals_ar);return;
	
	for(i=0; i<vals_ar.length; i++) {
		var req = vals_ar[i];
		passed = true;
		hasInput = false;
		
		if(isRequired(validate_str[el.id])) {
			//should have anyway...
			hasInput = true;
			//console.log('has input');
		} else {
			//if not required, check if any input so as to still validate the field
			hasInput = checkLengthWithin(el, 1, 300);
			if(!hasInput) {
				//move onto next field to validate
				//alert('moving on to next.');
				continue;
			}
		}
		//console.log(el.type+' '+el.name);
		if(el.type=="checkbox") {
			//isRequired
			if(hasInput) {
				if(el.checked) {
					passed = true;
				} else {
					passed = false;
				}
			}
		} else if(req=='required') {
			passed = checkLengthWithin(el, 1, 300);
		} else if(req=='VALID_LENGTH_GREATER') {
			i++;
			min = vals_ar[i];
			passed = checkLengthWithin(el, min, 300);
		} else if(req=='VALID_NOT_EMPTY') {
			passed = checkLengthWithin(el, minChars, 300);
		} else if(req=='VALID_EXPRESSION') {
			i++;
			passed = checkMatch(el, regex_ar[vals_ar[i]]);
		} else if(req=='VALID_NUMBER') {
			//start and end with numbers... no other chars allowed.
			passed = checkMatch(el,/^[0-9]{1,}$/);
		} else if(req=='VALID_EMAIL') {
			passed = checkEmail(el);
		} else if(req=='VALID_LENGTH_MAX') {
			i++;
			passed = checkLengthWithin(el, 1, vals_ar[i]);
		}
		
		output += req;			
		output += "\n passed: "+passed+"\n";
		
		if(!passed) {
			break;
		}
	}
	

	var bad = $('code_invalid');
	var good = $('code_correct');

	//special case
	if(el.id=='SignupAgentCode') {
		if(checkLengthWithin(el, 5, 5)) {
			confirmDiscountCode(el, el.value);
		} else {
			if(el.value=='') {
				passed =true;
				good.style.display = 'none';
				bad.style.display = 'none';
			} else {
				passed = false;
				bad.style.display = 'inline';
				good.style.display = 'none';
			}
		}
	}

	
	if(!passed) {
		el.className = 'form_error required';
	} else {
		el.className = '';
		passed_elements++;
	}
	
	//alert(output);
}


function confirmDiscountCode(el, val) {
	//alert('user entered: '+val);
	el.className = 'form_error required';
	new Ajax.Updater('discountResponse', '/home/signups/check_discount_code/'+val, {
  parameters: { text: val }, evalScripts:true});
  //show the 'searching...' text.
  
  var good = $('code_correct');
  var bad = $('code_invalid');
	
  good.style.display = 'none';
  bad.style.display = 'none';
	
  $('code_searching').style.display = 'inline';	
}

function populateFields(res_a, res_b, res_c) {
	var a = $('SignupAgentName');
	var b = $('SignupAgentSuburb');
	var c = $('SignupAgentState');
	var el = $('SignupAgentCode');
	
	var good = $('code_correct');
	var bad = $('code_invalid');
	var search = $('code_searching');
	
	search.style.display = 'none';
	
	if(res_a=='') {
		//code does not exist
		el.className = 'form_error required';
		good.style.display = 'none';
		bad.style.display = 'inline';
		
	} else {
		a.value = res_a;
		b.value = res_b;
		c.value = res_c;
		el.className = '';
		
		a.onchange();
		b.onchange();
		c.onchange();
		
		good.style.display = 'inline';
		bad.style.display = 'none';
		

	}
}


function checkEmail(el) {
	var str = el.value;
	return str.match(email_regex);
}

function checkMatch(el, regex) {
	var str = el.value;
	//console.log('checking expression: '+regex);
	
	if(str.match(regex)) {
		//console.log('found match');
		return true;
	}
		
	return false;
}

function checkLengthWithin(el, min, limit) {
	if(el.value.length>=min && el.value.length <= limit) {
		return true;
	}
	return false;
}

function getValidationRules(id) {
	var str = validate_str[id];
	var ret_val = str.split("-:-");
	return ret_val;
}

function addValidationEvents() {
	for (a in validate_str) {
		var el = getE(a);
		if(el) {
			//onkeyup
			el.onchange = validateField;
			el.onblur = validateField;
		}
	}
}

function isRequired(str) {
	var bits = str.split("-:-");
	if(bits[0]=="required") return true
	return false;
}

function getE(el) {
	var e = document.getElementById(el);
	if(e) return e;
	else return null;
}

function print_r(ar) {
	var out = '';
	for(abc=0; abc<ar.length; abc++) {
		out += ' ar: '+ar[abc];
	}
	alert(out);
}

window.onload = init;
