/*
*	+------------------------------------------------------------------------------+
*		Shopping Trader: validation.js
*	+------------------------------------------------------------------------------+
*		Copyright Notice(s)
*	+------------------------------------------------------------------------------+
*		Disclaimer Notice(s)
*	+------------------------------------------------------------------------------+
*		Author(s): Michael 
*	+------------------------------------------------------------------------------+
*		Last updated 17 April 2005
*	+------------------------------------------------------------------------------+
*/

/**
*	VALIDATION FUNCTIONS
*	Validates any form by adding an extra attribute to the input field:  validate=""
*	Browser compatibility: Should work in Internet Explorer and Firefox
*
	EXAMPLE USAGE:

	<label for="field1">Field1</label>
	<input type="text" name="field1" id="field1" value="" validate="required" />
	<span id="field1_validation_message" /></span><br/>
*/

/**
*	MASK FUNCTIONS
*	The ability to mask input by adding an extra attribute to the input field:  mask=""
*	Browser compatibility:  IE Only, due to inconsistencies with the Firefox event model.

	EXAMPLE USAGE:

	<input type="text" name="field1" id="field1" value="" mask="digits_only" />
*/

// ** VARIABLES **

var validation_success=true;



var WGdc="."; var WGgc=","; var WGnc="(";

// ** EXECUTE AT RUNTIME **

addEvent(window, 'load', function() {
	var input;
    var inputs = document.getElementsByTagName('input');
    for (var i = 0; (input = inputs[i]); i++) {
		addEvent(input, 'keypress', oninputkeypress);
	//	addEvent(input, 'focus', oninputfocus);
        addEvent(input, 'blur', oninputblur);
    }
    var selects = document.getElementsByTagName('select');
    for (var i = 0; (select = selects[i]); i++) {
        addEvent(select, 'blur', oninputblur);
    }
	var textareas = document.getElementsByTagName('textarea');
    for (var i = 0; (textarea = textareas[i]); i++) {
	//	addEvent(textarea, 'focus', oninputfocus);
        addEvent(textarea, 'blur', oninputblur);
    }
});

// ** FUNCTIONS **

// ** SPECIFIC VALIDATION FUNCTIONS FOR SHOPPING TRADER **

function check_phone_numbers(id){
    var form_field = document.getElementById(id);
	var validation_message = document.getElementById(id+"_validation_message");

	// Get phone numbers from registration form step 3
	var home_phone = document.getElementById("home_phone");
	var work_phone = document.getElementById("work_phone");
	var mobile = document.getElementById("mobile");

	if ((home_phone.value.length == 0 && work_phone.value.length == 0 && mobile.value.length == 0) || (check_au_phone_number(home_phone.id) == false || check_au_phone_number(work_phone.id) == false || check_au_phone_number(mobile.id) == false)) {
		update_validation_success(false, validation_message, "You must supply at least one valid phone number<br/>");
		return;
	} else {
		update_validation_success(true, validation_message,"At least one valid phone number has been entered.<br/>");
    }
}

function check_phone_number_supplied(id){
    var form_field = document.getElementById(id);
	var validation_message = document.getElementById(id+"_validation_message");

	// Get phone numbers from registration form step 3
	var home_phone = document.getElementById("home_phone");
	var work_phone = document.getElementById("work_phone");
	var mobile = document.getElementById("mobile");

	if (check_au_phone_number(eval(form_field.value).id) == false) {
		update_validation_success(false, validation_message, "A valid "+form_field.options[form_field.selectedIndex].text+" has not been entered.");
		return;
	} else {
		update_validation_success(true, validation_message,"");
    }
	if (eval(form_field.value).value.length == 0) {
		update_validation_success(false, validation_message, "No "+form_field.options[form_field.selectedIndex].text+" number has been entered.");
		return;
	} else {
		update_validation_success(true, validation_message,"");
    }

}


// ** GENERAL VALIDATION FUNCTIONS **

function check_required(id) {
    var form_field = document.getElementById(id);
	var validation_message = document.getElementById(id+"_validation_message");
	if (form_field.value.length == 0) {
		update_validation_success(false, validation_message, "This field cannot be empty");
		
		return;
	} else {
		update_validation_success(true, validation_message,"");
		
    }
}

function check_ticked(id){
    var form_field = document.getElementById(id);
	var validation_message = document.getElementById(id+"_validation_message");
	if (form_field.checked != true) {
		update_validation_success(false, validation_message, "Attention required!");
	} else {
		update_validation_success(true, validation_message,"");
    }
}

function check_au_phone_number(id){
    var form_field = document.getElementById(id);
	var validation_message = document.getElementById(id+"_validation_message");
	switch (true){
	case (form_field.value.length < 10 && form_field.value.length > 0) :
		update_validation_success(false, validation_message, "Must be 10 digits (inc. area code), or leave the field blank.");
		return false;
	break;
	default:
		update_validation_success(true, validation_message,"");
		return true;
    }

}

function cardval(id) {
	var form_field = document.getElementById(id);
	var validation_message = document.getElementById(id+"_validation_message");
	var s=form_field.value;
	var v = "0123456789";
	var w = "";
	for (i=0; i < s.length; i++) {
		x = s.charAt(i);
		if (v.indexOf(x,0) != -1)
		w += x;
	}
//	form_field.value=w;	//If you want to automatically remove invalid characters do it here
	j = w.length / 2;
	if (j < 6.5 || j > 8 || j == 7) return false;
	k = Math.floor(j);
	m = Math.ceil(j) - k;
	c = 0;
	for (i=0; i<k; i++) {
		a = w.charAt(i*2+m) * 2;
		c += a > 9 ? Math.floor(a/10 + a%10) : a;
	}
	for (i=0; i<k+m; i++) c += w.charAt(i*2+1-m) * 1;
	return (c%10 == 0);
}


function check_credit_card(id){
	var form_field = document.getElementById(id);
	var validation_message = document.getElementById(id+"_validation_message");

	if (cardval(form_field)==true){
		update_validation_success(true, validation_message,"");
	}else{
		update_validation_success(false, validation_message, "Must be a valid credit card number.");
		return;
	}
}

////////////////////////////////////////////////////////////////////////////////////////////
function check_username_email(id){
	
	var form_field = document.getElementById(id);
	var validation_message = document.getElementById(id+"_validation_message");
	var email_string=form_field.value;
	var email_pattern=/^(.+)@(.+)$/
	var email_pattern1=/@/
	var email_pattern2=/\./
			
	if (form_field.value.length<2) {
		update_validation_success(false, validation_message, "");
		return;	   
	}
	var match_array=email_string.match(email_pattern1)
		if (match_array != null) {
		update_validation_success(false, validation_message, "");
	return;
	}
	var match_array=email_string.match(email_pattern2)
		if (match_array != null) {
		update_validation_success(false, validation_message, "");
	return;
	}
	
	
	var match_array=email_string.match(email_pattern)
		if (match_array != null) {
		update_validation_success(false, validation_message, "");
	return;
	}
update_validation_success(true, validation_message,"");
	
	}





//////////////////////////////////////////////////////////////////////////////////////////////








function check_email(id) {
	var form_field = document.getElementById(id);
	var validation_message = document.getElementById(id+"_validation_message");
	var email_string=form_field.value;
	var email_pattern=/^(.+)@(.+)$/
	var special_characters="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
	var valid_characters="\[^\\s" + special_characters + "\]"
	var quoted_user="(\"[^\"]*\")"
	var ip_domain_pattern=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
	var atom=valid_characters + '+'
	var word="(" + atom + "|" + quoted_user + ")"
	var user_pattern=new RegExp("^" + word + "(\\." + word + ")*$")
	var domain_pattern=new RegExp("^" + atom + "(\\." + atom +")*$")
	var match_array=email_string.match(email_pattern)
	if (match_array==null) {
		update_validation_success(false, validation_message, "Email address seems incorrect (check @ and .'s)");
		return;
	}
	var user=match_array[1]
	var domain=match_array[2]

	if (user.match(user_pattern)==null) {
		update_validation_success(false, validation_message, "The username doesn't seem to be valid.");
		return;
	}
	var ip_array=domain.match(ip_domain_pattern)
	if (ip_array!=null) {
		for (var i=1;i<=4;i++) {
			if (ip_array[i]>255) {
				update_validation_success(false, validation_message, "Destination IP address is invalid!");
				return;
			}
		}
		update_validation_success(true, validation_message,"");
	}
	var domain_array=domain.match(domain_pattern)
	if (domain_array==null) {
		update_validation_success(false, validation_message,"The domain name doesn't seem to be valid.");
		return;
	}
	var atomPat=new RegExp(atom,"g")
	var domArr=domain.match(atomPat)
	var len=domArr.length
	if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>3) {
		update_validation_success(false, validation_message, "The address must end in a three-letter domain, or two letter country.");
		return;
	}
	if (len<2) {
		update_validation_success(false, validation_message, "This address is missing a hostname!");
		return;	   
	}
		update_validation_success(true, validation_message,"");
}

function update_validation_success(bool, message_obj,error_message_string){
	if (bool == false){
		
		message_obj.innerHTML = error_message_string;
		message_obj.className = 'invalid';
	validation_success=false;
	}
	if (bool == true){
	if (error_message_string != ""){
	
			message_obj.innerHTML = error_message_string;
	}else{
		
	message_obj.innerHTML = "&nbsp;";
		}
	
		message_obj.className = 'valid';
	}
}


// ** MASK FUNCTIONS **

function mask_digits_only(e) {
	var Key = e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which;
	switch (true){
		case((e.shiftKey) && (Key == 35 || Key == 36)):
			return Key;
		break;
		case((Key >= 48 && Key <= 57)||(Key == 35)||(Key == 36)||(Key == 8)||(Key == 46)||(Key == 16)||(Key == 9)):
			return Key;
		break;
		default:
			return false;
	}
}

function mask_money_only(e) {
	var Key = e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which;
	var source;
	if (typeof e.target != 'undefined') {
		source = e.target;
	} else if (typeof e.srcElement != 'undefined') {
		source = e.srcElement;
	} else {
		return;
	}
	
	window.status=Key;

	switch (true){
		case((Key >= 48 && Key <= 57)||(Key == 8)||(Key == 16)||(Key == 9)):
			return Key;
		break;
		case (Key == 46):
		
		var myString = source.value; 
			var index = myString.indexOf("."); 
			if (index != -1) { 
				return false;
			}else{
				return Key;
			}
		default:
			return false;
	}
}




// ** EVENT HANDLERS **

function addEvent(obj, evType, fn){
    if (obj.addEventListener){
        obj.addEventListener(evType, fn, true);
        return true;
    } else if (obj.attachEvent){
        var r = obj.attachEvent("on"+evType, fn);
        return r;
    } else {
        return false;
    }
}

function validate_form(f){
	validation_success=true;
	var field_id;
	var flag = 0;
	for (var i=0; i<f.elements.length; i++){
		flag = 0;
		var e = f.elements[i];
		if ((e.required) || (e.getAttribute("validate"))){
			switch(e.getAttribute("validate")){
			// GENERAL VALIDATION
				case "required" :
					field_id = e.id;
					check_required(e.id);
				break;
				case "ticked" :
					field_id = e.id;
					check_ticked(e.id);
				break;
				case "email" :
					field_id = e.id;
					check_email(e.id);
				break;
				case "credit_card" :
					field_id = e.id;
					check_credit_card(e.id);
				break;
				case "au_phone_number" :
					field_id = e.id;
					check_au_phone_number(e.id);
				break;
			// SHOPPING TRADER VALIDATION
				case "phone_number_check" :
					field_id = e.id;
					check_phone_numbers(e.id);
				break;
				case "phone_number_supplied" :
					field_id = e.id;
					check_phone_number_supplied(e.id);
				break;
				
				case "check_username_email" :
				  field_id = e.id;
				  check_username_email(e.id);
				break;
				
				default:
			}
			
			
		}
		if(validation_success==false){break;}
		
	}

	if (validation_success == false)
	{
		alert("The information you have supplied is incomplete.  Please review any error messages and try again.");
		if(field_id){
		document.getElementById(field_id).select();}
	}
	return validation_success;
}

function validate_element(e){
	if ((e.required) || (e.getAttribute("validate"))){
		switch(e.getAttribute("validate")){
			case "required" :
				return check_required(e.id);
			break;
			case "ticked" :
				return check_ticked(e.id);d
			break;
			case "email" :
				return check_email(e.id);
			break;
			case "credit_card" :
				return check_credit_card(e.id);
			break;
			case "au_phone_number" :
				return check_au_phone_number(e.id);
			break;
		// SHOPPING TRADER VALIDATION
			case "phone_number_check" :
				return check_phone_numbers(e.id);
			break;
			case "phone_number_supplied" :
				return check_phone_number_supplied(e.id);
			break;
			
			default:
		}
	}
}


function mask_element(e){
	var Key = e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which;
	var source;
	if (typeof e.target != 'undefined') {
		source = e.target;
	} else if (typeof e.srcElement != 'undefined') {
		source = e.srcElement;
	} else {
		return;
	}
	if ((source.required) || (source.getAttribute("mask"))){
		switch(source.getAttribute("mask")){
			case "digits_only" :
				return mask_digits_only(e);
			break;
			case "money_only" :
				return mask_money_only(e);
			break;

			default:
		}
	}
}

function oninputfocus(e) {
	var e = (window.event) ? window.event : e;
    var source;
    if (typeof e.target != 'undefined') {
        source = e.target;
    } else if (typeof e.srcElement != 'undefined') {
        source = e.srcElement;
    } else {
        return;
    }
//    source.className='currentfield';
}


function oninputblur(e) {
	var e = (window.event) ? window.event : e;
    var source;
    if (typeof e.target != 'undefined') {
        source = e.target;
    } else if (typeof e.srcElement != 'undefined') {
	source = e.srcElement;
    } else {
        return;
    }
	validate_element(source);
}


function oninputkeypress(e) {

	var e = (window.event) ? window.event : e;
	var Key = e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which;
	if (Key==13) {
		return false;
	}else{
		return mask_element(e);
	}
}


// ** HELPER FUNCTIONS **

 function getLabelForId(id)
 {
      var labels = document.getElementsByTagName('label');
      for (var i = 0; i < labels.length; i++)
      if (labels[i].htmlFor == id)
          return labels[i];
      return null;
 }


function FormatMoney(A) {
  var N=Math.abs(Math.round(A*100));
  var S=((N<10)?"00":((N<100)?"0":""))+N;
  S=((A<0)?WGnc:"")+S.substring(0,(S.length-2))+WGdc+
    S.substring((S.length-2),S.length)+((A<0&&WGnc=="(")?")":"");
  return S;
}
function StringFormatMoney(A) {
  var N=Math.abs(Math.round(A*100));
  var S=((N<10)?"00":((N<100)?"0":""))+N;
  S=((A<0)?WGnc:"")+Group(S.substring(0,(S.length-2)))+WGdc+
    S.substring((S.length-2),S.length)+((A<0&&WGnc=="(")?")":"");
  return S;
}


function Group(S) {
  return (S.length<4)?S:(Group(S.substring(0,S.length-3))+
    WGgc+S.substring(S.length-3,S.length));
}
