// ** 
// ** 
// **                 Common reusable functions.
// ** 
// ** 
// **              These functions are copyright of 
// **      Nitin Vericherla and Glenbriar Technologies Inc.
// ** 
// ** You may copy these functions if you leave this notice intact.
// ** 
/*
	filterInput (input,the_type)
	limitInput(theobj,thesize)
	focus_form()
	
	test_email(the_str)
	test_phones(phone1,phone2)
	test_longPhone(thenum)
	check_password(theid,strength)
	
	isinlist(T_element,T_id)
	toggle_the_div(thediv)
	
	GEBI(theid): 	returns element
	$G(theid): 		returns value of element
	$G_DD(theid): 	returns selectedvalue of dropdown
	$G_DD_i(theid): 	returns selectedindex of dropdown
	$G_DD_t(theid): 	returns selectedtext of dropdown
	
	$S(theid,theval): 				sets value of element
	change_DD(the_object,the_value): 	changes selectedindex of dropdown by value
	$S_html(theid,thehtml): 			sets innerHTML of element
	
	date_adjust(thedate,theamount,theterm,positive)
	date_greater(date1,date2)
	
*/

//________________________________________________________________________________________ 
//________________________________________________________________________________________ Input validation

function filterInput (input,the_type) {
	var s = input.value;
	var RE;
	var action = 'REPLACE';
	var returnString = "";
	var hasChanged = false;
	var dummy;
	
	switch (the_type) {
		case "REG_stricttext":
			RE = /[^a-zA-Z0-9]/g;
			break;
		case "REG_num":
			RE = /[^0-9]/g;
			break;
		case "Y-m-d":
			RE = /[0-9]{4}\-[0-9]{1,2}\-[0-9]{1,2}/g;
			action = 'CHECK';
			break;
		case "REG_email":
			RE = /^[a-zA-Z0-9\_\.\-]+\@(([a-zA-Z0-9\-])+\.)+[a-zA-Z]{2|3}$/;
			action = 'CHECK';
			break;
		case "REG_phone":
			RE = /[^0-9]/g;
			action = 'CHECK';
			break;
		default:
			RE = /^$/g;
			break;
	}

	
	if (action == 'REPLACE') {
		if (s.search(RE) != -1) {
			returnString = s.replace(RE,'');
			hasChanged = true;
		}
		else
			returnString = s;
	}
	else {
		returnString = s;
		
		
		if (!s.match(RE))
			hasChanged = true;
	}
	
	if ((the_type == "REG_num") && (returnString.length == 0)) {
		input.value = "0";
		hasChanged = true;
	}
	else {
		input.value = returnString;
	}
	
	input.style.backgroundColor = (hasChanged) ? "#FFFF99" : "#FFFFFF";
	
}

//________________________________________________________________________________________ 
//________________________________________________________________________________________ Limit characters in textarea

function limitInput(theobj,thesize) {
	var thestr = theobj.value;
	var thelen = theobj.value.length;
	
	if (thelen > thesize) {
		theobj.value = thestr.substring(0,thesize);
		theobj.style.backgroundColor = "#FFFF99";
	}
	else
		theobj.style.backgroundColor = "#FFFFFF";
}

//________________________________________________________________________________________ 
//________________________________________________________________________________________ Email validation

function test_email(the_str) {
	var is_valid = true;
	var emailFilter=/^.+@.+\..{2,3}$/;
	
	if (the_str == "")
		is_valid = true;
	else if (!(emailFilter.test(the_str)))
		is_valid = false;
	
	return is_valid;
}


//________________________________________________________________________________________ 
//________________________________________________________________________________________ Date validation

function test_date(the_str) {
	var is_valid = true;
	var dateFilter = /^([0-9]{4})\-([0-9]{1,2})\-([0-9]{1,2})$/;
	
	if (the_str == "")
		is_valid = true;
	else if (!(dateFilter.test(the_str)))
		is_valid = false;
		
	return is_valid;
}

//________________________________________________________________________________________ 
//________________________________________________________________________________________ Phone number validation

function test_phones(phone1,phone2) {
	var is_ok = true;
	
	if ((phone1.length != 0) && (phone1.length != 3))
		is_ok = false;
	else if ((phone2.length != 0) && (phone2.length != 4))
		is_ok = false;
	else if (((phone1.length == 0) && (phone2.length != 0))||((phone1.length != 0) && (phone2.length == 0)))
		is_ok = false;
	
	return is_ok;
}

function test_longPhone(thenum) {
	var is_ok = true;
	
	if ((thenum.length != 0) && (thenum.length != 7) && (thenum.length != 10) && (thenum.length != 11))
		is_ok = false;
	else if ((thenum.length == 11) && (thenum.charAt(0) != '1'))
		is_ok = false;
	
	return is_ok;
	
}

//________________________________________________________________________________________ 
//________________________________________________________________________________________ Change selected index of drop-down

function change_DD(the_object,the_value) {
	var not_found = true;
	var i_change_DD;
	
	for (i_change_DD = 0; ((i_change_DD < document.getElementById(the_object).length)&&(not_found)); i_change_DD++) {
		if (document.getElementById(the_object).options[i_change_DD].value == the_value) {
			document.getElementById(the_object).selectedIndex = i_change_DD;
			not_found = false;
		}
	}
}

//________________________________________________________________________________________ 
//________________________________________________________________________________________ Date adjustment by term (DAY,MONTH,etc)

function date_adjust(thedate,theamount,theterm,positive) {
	var date_ret = new Date();
	var T_dateparts = thedate.split("-");
	
	date_ret.setFullYear(Number(T_dateparts[0]),Number(T_dateparts[1]-1),Number(T_dateparts[2]));
	
	switch(theterm) {
		case "YEAR":
			if (positive)
				date_ret.setYear(date_ret.getYear() + Number(theamount));
			else
				date_ret.setYear(date_ret.getYear() - Number(theamount));
			break;
		case "MONTH":
			if (positive)
				date_ret.setMonth(date_ret.getMonth() + Number(theamount));
			else
				date_ret.setMonth(date_ret.getMonth() - Number(theamount));
			break;
		case "WEEK":
			if (positive)
				date_ret.setDate(date_ret.getDate() + (7 * Number(theamount)));
			else
				date_ret.setDate(date_ret.getDate() - (7 * Number(theamount)));
			break;
		case "DAY":
			if (positive)
				date_ret.setDate(date_ret.getDate() + Number(theamount));
			else
				date_ret.setDate(date_ret.getDate() - Number(theamount));
			break;
		default:
			break;
	}
	
	return date_ret.getFullYear() + "-" + (date_ret.getMonth() + 1) + "-" + date_ret.getDate();
}

//________________________________________________________________________________________ 
//________________________________________________________________________________________ Date comparison from strings

function date_greater(date1,date2) {
	var ret = false;
	
	if ((date1 != "")&&(date2 != "")) {

		var new_date1 = new Date();
		var new_date2 = new Date();
		
		var date1_parts = date1.split("-");
		var date2_parts = date2.split("-");
		
		new_date1.setFullYear(Number(date1_parts[0]),Number(date1_parts[1]-1),Number(date1_parts[2]));
		new_date2.setFullYear(Number(date2_parts[0]),Number(date2_parts[1]-1),Number(date2_parts[2]));
		
		if (new_date1 > new_date2)
			ret = true;
	}

	return ret;
}


//________________________________________________________________________________________ 
//________________________________________________________________________________________ Is In List 

function isinlist(T_element,T_id) {
	var ret = false;
	
	for (var i = 0;i < document.getElementById(T_id).length;i++) {
		if (document.getElementById(T_id).options[i].value == T_element) {
			ret = true;
			break;
		}
	}
	
	return ret;
}



//________________________________________________________________________________________ 
//________________________________________________________________________________________ Toggle .display 

function toggle_the_div(thediv) {
	document.getElementById(thediv).style.display = (document.getElementById(thediv).style.display != 'none')?'none':'block';
}


//________________________________________________________________________________________ 
//________________________________________________________________________________________ getElementById shorthand 

function GEBI(theid) {
	try {
		if (document.getElementById(theid)) {}
	}
	catch (e) { return false; }
	
	return document.getElementById(theid);
}

//________________________________________________________________________________________ 
//________________________________________________________________________________________ Manipulate/return value of element by ID 

//________________________________________ GETTERS

	//____________________ normal get value
	function $G(theid) {
		var T_dummy = "";
		
		try { T_dummy = GEBI(arguments[0]).value; } catch(e) {}
		return T_dummy;
	}

	//____________________ get value for drop down
	function $G_DD(theid) {
		var T_dummy = "";
		
		try { T_dummy = GEBI(theid)[GEBI(theid).selectedIndex].value; } catch(e) {}
		return T_dummy;
	}

	//____________________ get selected index of dropdown
	function $G_DD_i(theid) {
		var T_dummy = "";
		
		try { T_dummy = GEBI(theid).selectedIndex; } catch(e) {}
		return T_dummy;
	}

	//____________________ get selected text of dropdown
	function $G_DD_t(theid) {
		var T_dummy = "";
		
		try { T_dummy = GEBI(theid)[GEBI(theid).selectedIndex].text; } catch(e) {}
		return T_dummy;
	}

	//________________________________________ SETTERS
	//____________________ set value of element
	function $S(theid,theval) {
		try { GEBI(theid).value = theval; } catch(e) {}
		return true;
	}

	//____________________ set innerHTML of element
	function $S_html(theid,thehtml) {
		try { GEBI(theid).innerHTML = thehtml; } catch(e) {}
		return true;
	}


	//________________________________________ OTHER
	//____________________ set styles

	function $style(theid,the_attr,the_val) {
		eval("GEBI(theid).style." + the_attr + " = " + the_val);
	}

//________________________________________________________________________________________ 
//________________________________________________________________________________________  Focus on 1st text element 

function focus_form() {
	var i = 0;
	var inputs = document.forms[0].getElementsByTagName("input");
	
	if (inputs.length > 0) {
		while (inputs[i].type != "text")
			i++;
		
		if (i < inputs.length)
			inputs[i].focus();
	}
}

//________________________________________________________________________________________ 
//________________________________________________________________________________________  Check password for strength

function check_password(theid,strength) {
	var has_letters = false;
	var has_numbers = false;
	var thestrength = false;
	var has_specials = false;
	
	if ($G(theid).match(/([0-9])+/))
		has_numbers = true;
	if ($G(theid).match(/([a-z]|[A-Z])+/))
		has_letters = true;
	if ($G(theid).match(/[^a-zA-Z0-9]/))
		has_specials = true;
	
	switch (strength) {
		case "alphanumeric":
			thestrength = !has_specials && has_letters;
			break;
		case "alphanumeric_strict":
			thestrength = has_letters && has_numbers && !has_specials;
			break;
		default:
			break;
	}
	
	return thestrength;
}
