/**
 * Common JavaScript library which can be usefull when dealing with user input forms
 * 
 * @author 		Christiaan Veder
 * @created 	april 6th 2011
 * @description Contains some basis functionality for string rewriting, value testing of phone numbers, 
 * 				e-mail address, postalcodes, etc.
 */

/**
 * BASIC STRING FUNCTIONS
 */

/**
 * Removes all non-numeric characters from a string
 * @param val string
 * @returns string
 */

function removeNonNumeric(val)
{
	//Make sure we're working with a string through which we can loop
	val				=	String(val);
	//Instantiate result variable
	var nieuw		=	new String();
	//Loop through the variable we're testing and skip all non-numeric characters
	for (var a=0; a < val.length; a++)
	{
		//Only if the character is a number, thousand separator or decimal separator, add it to the result
		if ((! isNaN(parseInt(val.charAt(a)))) || (val.charAt(a) == ".") || (val.charAt(a) == ","))
		{
			nieuw	= 	nieuw + val.charAt(a);
		}
	}
	//Return the resulting string
	return nieuw;
}

/**
 * Uppercases the input from variable val
 * @param val string
 * @returns string
 */
function uc(val)
{
	return String(val).toUpperCase();
}

/**
 * Lowercases the input from variable val
 * @param val string
 * @returns string
 */
function lc(val)
{
	return String(val).toLowerCase();
}

/**
 * Lowercases the input from variable val and starts all seperate words with a capital
 * @param val string
 * @returns string
 */
function ucwords(val)
{
	val				=	lc(val);
	var nieuw		=	"";
	for (var l=0; l < val.length; l++)
	{
		//Determine if we need to uppercase something
		var toUp	=	false;
		if (l == 0)									{	toUp	= 	true;				}
		else if (val.charAt(parseInt(l-1)) == " ")	{	toUp 	= 	true;				}
		//Add either uppercased or lowercase character to the result string
		if (toUp == true)							{	nieuw 	+= 	uc(val.charAt(l));	}
		else										{	nieuw 	+= 	val.charAt(l);		}
	}
	//Return the resulting string
	return nieuw;
}



/**
 * SET OF REWRITE FUNCTIONS
 */

/**
 * Rewrites a certain value to a rounded integer of the original value
 * @param val
 * @return int
 */
function rewriteToInteger(val)
{
	if (String(val).length == 0)	{	return "";	}
	val	=	rewriteToAmount(val);
	return Math.round(val);
}

/**
 * Rewrites a certain value to a decimal value
 * @param val
 * @returns float
 */
function rewriteToAmount(val)
{
	//Make sure we're working with numeric data here
	val				=	removeNonNumeric(val);
	//Instantiate result variable
	var nieuw		= 	new String();
	//Loop through the variable we're testing in order to skip all the lead zero's
	for (var a=0; a < val.length; a++)
	{
		//Strip leading zero's
		if (val.charAt(a) == "0")
		{
			continue;
		}
		//We've encountered a non-zero value. Put the remainder of val into nieuw and break the loop
		else
		{
			nieuw	=	val.substr(a);
			break;
		}
	}
	
	nieuw			=	nieuw.replace(".", "");
	nieuw			=	nieuw.replace(",", ".");
	nieuw			=	parseFloat(nieuw);
	if (isNaN(nieuw))
	{
		nieuw		=	0;
	}
	return nieuw;
}

/**
 * Rewrites numeric input for an input field object
 * @param oObj DOM-object
 * @param bForceInt boolean
 * @returns void
 */
function fieldToAmount(oObj, bForceInt)
{
	var sNewValue			=	"";
	if (bForceInt == true)	{	sNewValue	=	rewriteToInteger(oObj.value);	}
	else 					{	sNewValue	=	rewriteToAmount(oObj.value);	}
	if (String(oObj.value).length > 0)
	{
		oObj.value			=	sNewValue;
	}
	return;
}

/**
 * Rewrites phone number input for an input field object
 * 
 * @param oObj DOM-object
 * @returns void  
 */
function fieldToPhone(oObj)
{
	var waarde			=	String(oObj.value);
	waarde = waarde.split(' ').join('');
	if (waarde.length == 0)	{	return;	}
	//Split the input value by phone delimiter ('-') (according to NL notation)
	var delen			=	waarde.split("-");
	if (delen.length != 2 && waarde.length >= 10)
	{
		if (waarde.substring(0,2) == "06")
		{
			delen[0]	=	waarde.substring(0,2);
			delen[1]	=	waarde.substring(2);
		}
		else
		{
			delen[0]	=	waarde.substring(0,3);
			delen[1]	=	waarde.substring(3);
		}
	}
	else if (waarde.length < 10)
	{
		if(oObj.value != '')
		{
			alert("Het opgegeven telefoonnummer is niet geldig.");										
			oObj.value	=	"";
		}
		return;
	}
	//Get the separate parts of the phone number
	var net		=	delen[0];
	var lijn	=	delen[1];
	//Detect crap-input
	var test	=	net+""+lijn;
	if ((test.length != 10)	|| (test == "0000000000") || (test == "0123456789") || (test == "0987654321") || (! isValidPhone(net, lijn)))
	{
		if(oObj.value!='')
		{
			alert("het opgegeven telefoonnummer is niet geldig");
			oObj.value	=	"";
		}
		return;	
	}
	oObj.value	=	net+"-"+lijn;
	return;
}

/**
 * Rewrites e-mail address input for an input field object
 * 
 * @param oObj DOM-object
 * @returns void
 */
function fieldToEmail(oObj)
{
	var defaultIllegal	=	new Array(33, 34, 35, 36, 37, 38, 40, 41, 42, 43, 47, 58, 59, 60, 61, 62, 91, 92, 93, 94,  96, 123, 124, 125, 126);
	var errStat			=	false;
	var waarde			=	String(oObj.value);
	var nieuw			=	"";
	for (var l=0; l < waarde.length; l++)
	{
		var found		=	false;
		for (var d=0; d < defaultIllegal.length; d++)
		{
			if (waarde.charCodeAt(l) == defaultIllegal[d])	{	found	=	true;				}
			else if (waarde.charAt(l) == " ")				{	found	=	true;				}
			else if (waarde.charAt(l) == "'")				{	found	=	true;				}
			else if (waarde.charAt(l) == ",")				{	found	=	true;				}
		}
		if (! found) 										{	nieuw	+=	waarde.charAt(l);	}
	}
	oObj.value			=	lc(nieuw);
	return;
}


/**
 * Rewrites a postalcode fiel value to dutch notation
 * @param oObj DOM-object
 * @returns void
 */
function fieldToPostalcode(oObj)
{
	var sWaarde	= 	oObj.value;
	sWaarde		=	String(sWaarde).replace(" ", "");
	oObj.value	=	uc(sWaarde);
}

/**
 * Rewrites a housenumber field value to an integer
 * @param oObj
 * @returns void
 */
function fieldToHousenumber(oObj)
{
	var sWaarde	=	removeNonNumeric(oObj.value);
	var iWaarde	=	rewriteToInteger(sWaarde);
	oObj.value	=	iWaarde;
}

/**
 * Rewrites a date field value to dutch-style notation date
 * @param oObj
 * @returns void
 */
function fieldToDate(oObj)
{
	var sWaarde		=	String(oObj.value);

	sWaarde = sWaarde.replace("o","0"); // just in case someone made a typo.
	sWaarde = sWaarde.replace("O","0");

	//Probeer eerst uit op welke logische separator de datumdelen te herkennen zijn
	if (sWaarde.length <= 0)	{	return;	}
	var delen		=	sWaarde.split("-");
	if (delen.length != 3)
	{
		delen		=	sWaarde.split(".");
	}
	if (delen.length != 3)
	{
		delen		=	sWaarde.split("/");
	}
	if (delen.length != 3)
	{
		oObj.value	=	"";
		return;
	}
	//Pak de afzonderlijke delen uit het array
   //alert("VOOR dag = "+delen[0]+" maand = "+delen[1]+" jaar = "+delen[2]);
   //bug 26 aug. 2011. day/month 08/09 failed! reason: if starts with a '0', switches to octal system!!!!!!!!!
   //http://www.w3schools.com/jsref/jsref_parseInt.asp
   //by giving a seond parameter '10' to parseInt, this is avoided.

	var sDag		=	parseInt(delen[0],10)+"";	// parseInt to avoid any crap in date fields
	var sMaand	=	parseInt(delen[1],10)+"";
	var sJaar	=	parseInt(delen[2],10)+"";
   //alert("NA dag = "+sDag+" maand = "+sMaand+" jaar = "+sJaar);

	//Test of de jaarnotatie toevallig aangevuld moet worden
	if (sJaar.length == 2)
	{
		if (parseInt(sJaar) < 30)	{	sJaar	=	"20"+sJaar;	}
		else						{	sJaar	=	"19"+sJaar;	}
	}
	if ((sJaar.length != 4) || (sDag.length < 1) || (sDag.length > 2) || (sMaand.length < 1) || (sMaand.length > 2))
	{
		oObj.value	=	"";
		return;
	}
	//Test of de invoer een valide datum is
	if (! isValidDate(sDag, sMaand, sJaar))
	{
		oObj.value	=	"";
		return;
	}
	//Vervolmaak de notatie waar nodig
	if (sDag.length == 1)	{	sDag	=	"0"+sDag;	}
	if (sMaand.length == 1)	{	sMaand	=	"0"+sMaand;	}
	if (sJaar < 1920)
	{
		oObj.value	=	"";
		return;
	}
	var currentTime	=	new Date();
	var currentYear = 	currentTime.getFullYear();
	if (currentYear < sJaar)
	{
		oObj.value	=	"";
		return;
	}
	oObj.value	=	sDag+"-"+sMaand+"-"+sJaar;
}



/**
 * VALUE TEST FUNCTIONS
 */


//equivalent to is_numeric in PHP
function IsNumeric(input)
{
   return (input - 0) == input && input.length > 0;
}

/**
 * Test if a complete string constitutes a valid phone number
 * @param sVal string
 * @returns boolean
 */
 /*
function isValidPhoneString(sVal)
{
	sVal				=	String(sVal);
	if (sVal.length < 10)
	{
		return false;
	}
	var delen			=	sVal.split("-");
   
	if (delen.length != 2 && sVal.length == 10)
	{
		if (sVal.substring(0,2) == "06")
		{
			delen[0]	=	sVal.substring(0,2);
			delen[1]	=	sVal.substring(2);
		}
		else
		{
			delen[0]	=	sVal.substring(0,3);
			delen[1]	=	sVal.substring(3);
		}
	}
	if (delen.length != 2)
	{
		return false;
	}
	return isValidPhone(delen[0], delen[1]);
}
*/
// Alternate validPhoneString.
// by EvdHeide 6-2-2012
// Check only if length = 10
// and is numeric.
// nothing more, nothing less.

function isValidPhoneString(sVal)
{
	sVal				=	String(sVal);
	if (sVal.length < 10)
	{
		return false;
	}
	sNumber 	=	String(removeNonNumeric(sVal));
	sNumber		=	sNumber.replace(".", "");
	sNumber		=	sNumber.replace(",", "");
   // Only numbers left...
   // Test if length < 10
	if (sNumber.length != 10)
	{
		return false;
	}
   return true;
}

function isValidEmail(sEmail) {
   var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
   if(reg.test(sEmail) == false) {
      return false;
   }
   return true;
}

/**
 * Tests whether a phone number (in parts) is valid or not
 * 
 * @param sNet string
 * @param sSubscriber string
 * @returns boolean
 */
function isValidPhone(sNet, sSubscriber)
{
	//First, remove non-numeric charachters from the input variables
	sNet			=	String(removeNonNumeric(sNet));
	sSubscriber		=	String(removeNonNumeric(sSubscriber));
	if ((sNet.length == 0) && (sSubscriber.length == 0))
	{
		return true;
	}
	//Points and comma's aren't stripped yet, so do that
	sNet			=	sNet.replace(".", "");
	sNet			=	sNet.replace(",", "");
	sSubscriber		=	sSubscriber.replace(".", "");
	sSubscriber		=	sSubscriber.replace(",", "");
	//Test value lengths
	if ((sNet.length < 2) || (sNet.length > 4))											{	return false;	}
	if ((sSubscriber.length < 6) || (sSubscriber.length > 8))							{	return false;	}
	//Test that net-number starts with a 0
	if (sNet.charAt(0) != "0")															{	return false;	}
	//Test the validity of the second character of the net-number
   if(sNet!="085" && sNet!="087")
   {
      if ((sNet.charAt(1) == "0") || (sNet.charAt(1) == "8") || (sNet.charAt(1) == "9"))  	{	return false;	}
   }

	//Test that the subscriber number does NOT start with a 0
	if (sSubscriber.charAt(0) == "0")													{	return false;	}
	//Test combined lengths of net and subscriber numbers
	if ((sNet.length == 2) && (sSubscriber.length != 8))								{	return false;	}
	else if ((sNet.length == 3) && (sSubscriber.length != 7))							{	return false;	}
	else if ((sNet.length == 4) && (sSubscriber.length != 6))							{	return false;	}
	//All checks passed. Seems valid enough
	return true;
}

/**
 * Tests whether or not a complete date sting constitutes a valid date
 * @param sDate string
 * @returns boolean
 */
function isValidDateString(sDate)
{
	if (String(sDate).length < 6)
	{
		return false;
	}
	var aDateParts	=	String(sDate).split("-");
	if (aDateParts.length != 3)
	{
		return false;
	}
	return isValidDate(aDateParts[0], aDateParts[1], aDateParts[2]);
}

/**
 * Tests whether a given value is a valid date
 * 
 * @param sDay string
 * @param sMonth string
 * @param sYear string
 * @returns boolean
 */
function isValidDate(sDay, sMonth, sYear)
{
	//Rewrite all input to integer values, just in case there are leading zero's and such
	var iDay		=	rewriteToInteger(sDay);
	var iMonth		=	rewriteToInteger(sMonth) - 1; //JavaScript months range from 0 to 11
	var iYear		=	rewriteToInteger(sYear);
	//Fead the input into a JavaScript Date object
	var inputDate 	= 	new Date(iYear, iMonth, iDay, 0, 0, 0, 0);
	//Test if the actual value of the Date object corresponds with the input.
	if (inputDate.getFullYear() != iYear) 	{ 	return false;	}	//year is not valid
	if (inputDate.getMonth() != iMonth) 	{ 	return false;	}	//month is not valid
	if (inputDate.getDate() != iDay)		{ 	return false;	}	//day is not valid
	//The input passed all checks, and is therefore considered valid
	return true;
}



/**
 * FIELD OPERATIONS
 */

/**
 * Common function to get a field value, based on field ID (even for radio's!!!)
 * @param sObjId string
 * @returns mixed
 */
function getValueById(sObjId)
{
	try
	{
		var oObj	=	document.getElementById(sObjId);
		if (oObj)
		{
			if (uc(oObj.tagName) == "SELECT")									{	return getSelectValue(sObjId);			}
			else if (uc(oObj.tagName) == "TEXTAREA")							{	return oObj.innerHTML;					}
			else if (uc(oObj.tagName) == "INPUT" && uc(oObj.type) == "RADIO")	{	return getRadioGroupValue(oObj.name);	}
			else if (uc(oObj.tagName) == "INPUT")								{	return oObj.value;						}
			return false;
		}
		return false;
	}
	catch (e)
	{
		alert("Probleem bij ophalen van waarde van veld '"+sObjId+"' :: " + e);
		return false;
	}
}

/**
 * Specific function to get the value from a SELECT object
 * @param sObjId string
 * @returns mixed
 */
function getSelectValue(sObjId)
{
	try
	{
		var oObj	=	document.getElementById(sObjId)
		if ((oObj.options) && (oObj.options.length > 0))	{	return oObj.options[oObj.selectedIndex].value;	}
		else												{	return false;									}
	}
	catch (e)
	{
		alert("Probleem bij ophalen van waarde van veld '"+sObjId+"' :: " + e);
		return false;
	}
}

/**
 * Specific function to get the selected value from a group of radio buttons
 * @param sGroupName string
 * @returns mixed
 */
function getRadioGroupValue(sGroupName)
{
	try
	{
		var aGroepje	=	document.getElementsByName(sGroupName);
		for (var a=0; a < aGroepje.length; a++)
		{
			if (aGroepje[a].checked == true)	{	return aGroepje[a].value;	}
		}
		return false;
	}
	catch (e)
	{
		alert("Probleem bij ophalen van waarde van radiogroup '"+sGroupName+"' :: " + e);
		return false;
	}
}
function fillForm(field_name,field_value)
{
   // data array contains:
   // 0 - form_element
   // 1 - field value
   x = document.getElementsByName(field_name)
   for(i=0;i<x.length;i++)
   {
      // alert(x[i].value);
      if (x[i].type=="text")
         x[i].value=field_value;
      if (x[i].type=="select-one")
         x[i].value=field_value;
      if (x[i].type=="radio")
         x[i].value=field_value;
      if(field_name=="client_birthdate" || field_name=="partner_birthdate" || field_name=="client_ect_date" || field_name=="partner_ect_date")
      {
         if(field_value!="")
            set_date_fields(field_name,field_value);
      }
   }
}

function set_date_fields(field_name,field_value)
{
   parsed_date = field_value.split('-');
   
   field_day = field_name + "_day";

   field_month = field_name + "_month";
   field_year = field_name + "_year";

   // fix trailing 0 for day and month
   if (parsed_date[0].charAt(0)=="0")
      parsed_date[0]=parsed_date[0].replace("0","");
   if (parsed_date[1].charAt(0)=="0")
      parsed_date[1]=parsed_date[1].replace("0","");

   
   
   if(document.getElementById(field_day)!=null)
   document.getElementById(field_day).value = parseInt(parsed_date[0]);
   if(document.getElementById(field_month)!=null)
   document.getElementById(field_month).value = parseInt(parsed_date[1]);
   if(document.getElementById(field_year)!=null)
   document.getElementById(field_year).value = parseInt(parsed_date[2]);
}


