// ./_js/common.js

// ----------------------
// general


// new window
function smallWindow(URL, id, width, height) {
	eval("page_"+id+" = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width='+width+',height='+height);");
	
	try {
		if (window.focus) {eval("page_"+id).focus()}
	} catch(err) {
	}
}


// change cursor to pointer
function changeCursor(which, what) {
	try {
		which.style.cursor = what;	
	} catch(err) {
	}
}



// ----------------------
// form-related


// confirmation
function confirmAction(strMessage, strURL) {
	var agree=confirm(strMessage);
	if (agree) {
		window.location = strURL;
	}
	else {
		return false;
	}
}


// check and submit form from outside of the form itself.
function checkAndSubmitForm(form_name) { 
	if(checkForm(document.forms['form_'+form_name])) {
		document.forms['form_'+form_name].submit();
	}
	return false;	
}


// set labels as errored
function setLabelsErrored(fieldName, isErrored) {
	try {
		var relevantLabels = document.getElementsByName('label_'+fieldName);		
		for(var i = 0; i < relevantLabels.length; i++) {
			relevantLabels[i].getElementsByTagName('span')[0].className = (isErrored) ? 'errored' : '';	
		}	
	} catch(err) {
	}
}


// resets "blur check"
var blurCheck_passed = true;
function resetBlurCheck() {
	blurCheck_passed = true;
}


// Search through string's characters one by one. If character is not a whitespace, append to returnString.
function trim(s) {
	var i;
	var returnString = "";	
	for (i = 0; i < s.length; i++) {
		// Check that current character isn't whitespace.
		var c = s.charAt(i);
		if (c != " ") returnString += c;
	}
	return returnString;
}


// Search through string's characters one by one. If character is not in bag, append to returnString.
function stripCharsInBag(s, bag) {
	var i;
	var returnString = "";	
	for (i = 0; i < s.length; i++) {
		// Check that current character isn't whitespace.
		var c = s.charAt(i);
		if (bag.indexOf(c) == -1) returnString += c;
	}
	return returnString;
}


// ----------------------
//  mandatory field validation

function validateObjText(objText) {
	try {
		return (objText.value.length > 0);
	} catch(err) {
	}
	return true;
}


function validateObjSelect(objSelectBox) {
	return (objSelectBox[objSelectBox.selectedIndex].value != '');
}


function validateObjCheckbox(objCheckbox) { // works for radios, too
	try {
		var thisCheckGroup = document.getElementsByName(objCheckbox.name); 
		for (i = 0; i < thisCheckGroup.length; i++) {
			if (thisCheckGroup[i].checked) {
				return true;
			}
		}
	} catch(err) {
	}
	
	return false;
}


function missedObjectMandatory(obj, failed_string){
	var has_value = true; // assume true
	
	try {
		switch(obj.type) {
			case 'text':
			case 'text_input':
			case 'text_area':
			case 'textarea':
			case 'password':
				has_value = validateObjText(obj);
			break;
			case 'checkbox':
			case 'radio':
				has_value = validateObjCheckbox(obj);
			break;
			case 'select':
			case 'select-one':
			case 'select-multiple':
				has_value = validateObjSelect(obj);
			break;
		}
		
		if(!has_value) {
			return (failed_string) ? failed_string : true;			
		}
	} catch (err) {
	}

	return false;	
}


function blurCheckObjMandatory(obj, failed_string) {
	try {
		if(blurCheck_passed) {			
			if(missedObjectMandatory(obj, '')) {
				setLabelsErrored(obj.name, true);			
				alert(failed_string);
				blurCheck_passed = false;
			} else {
				setLabelsErrored(obj.name, false);
			}
		}
	} catch (err) {
	}
}



// ----------------------
// format validation

function validateEmail(string) {
	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,6})$/;
	return (reg.test(string));
}


function validateInteger(string) {
	if(isNaN(string)) string = 0;
	return (string > 0);
}


function validateNumber(string) {
	return (!isNaN(string));
}



/* phone number validation */
function validatePhoneNumber(strPhone){
	var phoneNumberDelimiters = "()-. extnsio#"; // non-digit characters which are allowed in phone numbers (accepts any chars in the word extension)
	var validWorldPhoneChars = phoneNumberDelimiters + "+"; // characters which are allowed in international phone numbers -  a leading + is OK
	var minDigitsInIPhoneNumber = 10; // Minimum no of digits in an international phone no.

	var bracket=3;
	strPhone = trim(strPhone);
	if(strPhone.indexOf("+") > 1) return false; // only allow + as the first character
	if(strPhone.indexOf("-") != -1)bracket=bracket+1; // offset the bracket by 1 if - exists
	var openingBracketPos = strPhone.indexOf("("); // get position of opening bracket
 	var closingBracketPos = strPhone.indexOf(")"); // get position of closing bracket
	if(openingBracketPos != -1 && openingBracketPos > bracket)return false; // don't allow ( after the allocated bracet range
	if(openingBracketPos != -1 && closingBracketPos != openingBracketPos + 4) return false; // closing bracket must be 4 characters after opening bracket
	if(openingBracketPos == -1 && closingBracketPos !=- 1) return false; // can't have a closing bracket without an opening backet
	s=stripCharsInBag(strPhone,validWorldPhoneChars); // trim allowed chars
	return (validateNumber(s) && s.length >= minDigitsInIPhoneNumber); // check only numbers exist, and ensure minimum numbers is met
}


function validateFormat(format, data) {
	switch(format) {
		case 'email':
		case 'email_address':
			return validateEmail(data);
		break;
		case 'int':
			return validateInteger(data);
		break;
		case 'number':
			return validateNumber(data);	
		break;
		case 'phone':
		case 'phone_number':
			return validatePhoneNumber(data);	
		break;
	}
	
	return true;
}

function invalidObjectFormat(obj, format, failed_string){
	var is_valid = true; // assume true
	var value;
	
	try {		
		switch(obj.type) {
			case 'text':
			case 'text_input':
			case 'textarea':
				value = obj.value;
			break;
			case 'select':
			case 'select-one':
			case 'select-multiple':
				value = obj[obj.selectedIndex].value;
			break;
		}

		if(!validateFormat(format, value)) {
			return (failed_string) ? failed_string : 'true';
		}
	} catch (err) {
	}
	
	return false;	
}

function blurCheckObjFormat(obj, format, failed_string) {
	try {
		if(blurCheck_passed) {
			if(invalidObjectFormat(obj, format, '')) {
				setLabelsErrored(obj.name, true);
				alert(failed_string);
				blurCheck_passed = false;
			} else {
				setLabelsErrored(obj.name, false);
			}
		}
	} catch (err) {
	}
}
