/*************************************************************
 *
 *	Validate.js
 *
 *	Check if user's input is valid, based on type definitions.
 *	If value is not validated correctly, the user is warned
 *  and allowed to edit his input. 
 *  If input is found to be valid the application allows data
 *  to be posted to the server.
 *
 *************************************************************/

//some variables used in the script
//var time_separators = "\(?:\\:|-|\\.|\\ |\\,|\\/\)";

var msg 	= "";
var error = false;								//error message
var error_list = new Array();	//array containing the erroneous elements
var alert_color = "#F1AB00";	//set new bgcolor of inputfields when not valid value
var normal_color = "#ffffff";


var warning_cookie_name="validate_warning";

function save_validate_warning_cookie(value)
{
	var exp_date = new Date();
	exp_date.setFullYear(exp_date.getFullYear() +2);
	document.cookie = "validate_warning="+value+"; expires="+exp_date.toGMTString()+"; path=/";
}

function get_validate_warning_cookie() 
{
	//true: display warning message
	//false: hide warning message	
	if(document.cookie)
	{
		index = document.cookie.indexOf(warning_cookie_name);
		if (index != -1)
		{
			namestart = (document.cookie.indexOf("=", index) + 1);
			nameend = document.cookie.indexOf(";", index);
			if (nameend == -1) {nameend = document.cookie.length;}
			YouWrote = document.cookie.substring(namestart, nameend);
			return YouWrote;
		}
	}
}

function display_error_msg()
{
		var href="./lib/format/validate_warning.html";
		var warning_window = window.open(href, 'validate_warning','width=400,height=300,scrollbars=no');
		warning_window.focus();
}

function validate(f)
{
	if (f.action.value == "") // User probably pressed 'enter'
	{
		if (f.save_or_add_button != null) { f.save_or_add_button.focus(); }
		return false;
	}

	/***************
	*
	* DROP JAVASCRIPT VALIDATION DURING DEVELOPMENT!!!!!!!!!!!!!!!!!!!!
	*
	****************/
	return true;



	//save_validate_warning_cookie(true); // Used in testing. Reset cookie to show warning message...

	//User's input has been edited by format() (format.js) -> return to application
	if (allow_submit > 0) 
	{	
		alert("Programmet har endret på dine input, sjekk om de nye verdiene stemmer! \n"+ active_input);
		
		active_input.focus();	//set focus to changed input
		return false;					//value set in format.js
	}
	

	//Check every element of the form
	for (var i=0; i < f.elements.length; i++)
	{
		var field = f.elements[i];
		
		if (field.validate_as != null)
		{
			//Reset bgcolor of input fields
			if (field.type == "text") {field.style.background=normal_color;}

			//legat_nr_l?
			if (field.validate_as == "legat_nr_short")
			{
				if (!isLegat_nr_short(field.value)) error_list[error_list.length] = field;
			}
	
			//legat_nr_long?
			if (field.validate_as == "legat_nr_long")
			{
				if (!isLegat_nr_long(field.value)) error_list[error_list.length] = field;
			}
	
			//legat_account?
			if (field.validate_as == "legat_account")
			{
				if (!isLegat_account(field.value)) error_list[error_list.length] = field;
			}
	
			//string?
			if (field.validate_as == "string")
			{
				if (!isString(field.value)) error_list[error_list.length] = field;
			}
	
			//letter?
			else if (field.validate_as == "letters")
			{
				if (!isLetter(field.value)) error_list[error_list.length] = field;
			}
	
			//digits
			else if (field.validate_as == "digits")
			{
				if (!isDigits(field.value)) error_list[error_list.length] = field;
			}
	
			//number?
			else if (field.validate_as == "number")
			{
				if (!isNumber(field.value)) error_list[error_list.length] = field;
			}
	
			//integer?
			else if (field.validate_as == "integer")
			{
				if (!isInteger(field.value)) error_list[error_list.length] = field;
			}
	
			//decimal
			else if (field.validate_as == "decimal")
			{
				if (!isDecimal(field.value)) error_list[error_list.length] = field;
			}
	
			//boolean
			else if (field.validate_as == "boolean")
			{
				if (!isBoolean(field.value)) error_list[error_list.length] = field;
			}
	
			//time?
			else if (field.validate_as == "time")
			{
				if (!isTime(field.value)) error_list[error_list.length] = field;
			}
	
			//date?
			else if (field.validate_as == "date")
			{
				if (!isDate(field.value)) error_list[error_list.length] = field;
			}
	
			//year?
			else if (field.validate_as == "year")
			{
				if (!isYear(field.value)) error_list[error_list.length] = field;
			}
	
			//email?
			else if (field.validate_as == "email")
			{
				if (!isEmail(field.value)) error_list[error_list.length] = field;
			}
		}
	}

	//find elements that is not valid
	for (var i=0; i < error_list.length; i++)
	{	
		error_list[i].style.background=alert_color;
		//error += "\n"+"...."+error_list[i].name;
		error = true;
	}
	
	//an error has occured!
	if (error)
	{
		// check if user has protected himself for annoying popup warning messages..
		if ( get_validate_warning_cookie() == 'true')	{	display_error_msg(); }
				
		//reset values
		error = "";
		error_list = [];
		
		return false;
	}
	else { return true;	}
}



/*******************************
*
*	Check string
*
********************************/
function isString(f)
{
	return true;
	//don't see any problems here...
}



/********************************
*
*	Check letters
*
********************************/
function isLetter(f)
{
	if ( f.match(/[^a-zA-Z]/) ) return false;
	return true;
}



/********************************
*
*	Check digits
*
********************************/
function isDigits(f)
{
	//if not digits - add inputname to error_list
	if (f.match(/\D/) ) return false;
	return true;
}



/********************************
*
*	Check number
*
********************************/
function isNumber(f)
{
	//if not digits - add inputname to error_list
	if (!f.match(/^-?\d*\.?\d*$/)) return false;
	return true;
}


/********************************
*
*	Check integer
*
********************************/
function isInteger(f)
{
	if (!f.match(/^-?\d*$/) || f.match(/^-?0/)) return false;
	return true;
}


/********************************
*
*	Check decimal
*
********************************/

function isDecimal(f)
{

	if (!f.match(/^-?\d*\.\d*$/) ) return false;
	return true;
}



/********************************
*
*	Check boolean
*
********************************/
function isBoolean(f)
{
	if (!f.match(/^(0|1|true|false|y)$/i) ) return false;
	return true;
}


/********************************
*
*	Check time
*
********************************/
function isTime(f)
{
	var hh_max = 23;
	var mm_max = 59;
	var ss_max = 59;
	

	//(DIGIT)(SEP)(DIGIT)[(SEP)(DIGIT)]
	if (res = f.match(/^(\d{2}):(\d{2}):(\d{2})$/) )
	{
		if (res[1]>hh_max || res[2]>mm_max || res[3]>ss_max)	return false;
		return true;
	}
	return false;
}



/********************************
*
*	Check date
*
* Accept date in form yyyy-dd-mm and dd-mm-yyyy
*
********************************/
function isDate(input, alert)
{
	f = dateInput(input.value);

	//alert( f );
	//return true;

	var valid_date=true;		//is this a valid date?

	//yyyy-mm-dd
	var date = f.split("-");  //(year,month,day)

	if (date.length < 3) valid_date = false;

	var month_length=0;
	
	//check year
	if ( !date[0].match(/^\d{4}$/) )  valid_date=false;	//not valid year


	//check month
	if ( date[1].match(/^((0[1,3,5,7,8])|(1[0,2])|0{2})$/) )
	{
	  month_length = 31;			//(jan, march, may...)
	}
	else if ( date[1].match(/^((0[4,6,9])|(1[1]))$/) )
	{
	  month_length = 30;			//(apr, june, sept...)
	}	
	else if ( date[1].match(/^02$/) )
	{
	  //may divide on 4, and not 2000
	  if( !(((date[2])/4).toString()).match(/\D/) && !date[2].match(/^\d\d00$/) )
	  {
		month_length = 29;	  	//(feb "skuddår"...)	
	  }
	  else
	  {
  		month_length = 28;		//(feb normal)
	  }
	}	
  else valid_date=false;				//not valid year

	//check day
	if ( (date[2] < 0) || (date[2] > month_length) && !date[2].match(/^0{2}$/) ) valid_date=false;
	

	if (valid_date) { 
		if ( alert ) {
			input.style.backgroundColor=normal_color; 
			return true;
		}

		return true; 
	}

/*
	//accept date in form dd-mm-yyy
	if ( isDate(date[2].concat("-").concat(date[1]).concat("-").concat(date[0])))
	{
		return true;
	}
*/
	else { 
		// if alert is set, warn user with orange color
		if ( alert ) {
			input.style.backgroundColor=alert_color; 
			return true;
		}

		return false; 
	}
}





/********************************
*
*	Check year
*
********************************/
//is this a valid year?
function isYear(f)
{
	if (!f.match(/^\d{4}$/)) return false;
	return true;
}



/********************************
*
*	Check email address
*
********************************/
function isEmail(f)
{
	// regex for e-mail addresses where full=$1, user=$2, domain=$3
	// see pod documentation about this regex

	var word_rx = "[\x21\x23-\x27\x2A-\x2B\x2D\x2F\\w\x3D\x3F]+";
	var user_rx = word_rx         // valid chars
             + "(\." + word_rx + ")*";  // possibly more words preceded by a dot
	var dom_rx = "\\w[-\\w]*(?:\\.\\w[-\\w]*)*"; // less valid chars in domain names
	var ip_rx = "\\[\\d{1,3}(?:\\.\\d{1,3}){3}\\]";

	var address_rx = "^((" + user_rx + ")\@(" + dom_rx + "|" + ip_rx + "))$";
	
	var address_regExp = new RegExp(address_rx);

	var res =	f.match(address_regExp);
	if (!res) return false;
	return true;
}



/*******************************
*
*	Check legat_nr_short
*
********************************/
function isLegat_nr_short(f)
{
	if( f.match(/^(L|S)\d{5}$/i)) return true;
	return false;
}




/*******************************
*
*	Check legat_nr_long
*
********************************/
function isLegat_nr_long(f)
{
	if( f.match(/^(L|S)\d{2}-\d{5}$/i)) return true;
	return false;
}




/*******************************
*
*	Check legat_account
*
********************************/
function isLegat_account(f)
{
	if( f.match(/^\d{1,4}\.\d{1,2}\.\d{1,5}$/)) return true;
	return false;
}


/*******************************
*
*	date input format yyyy-mm-dd
*
********************************/
function dateInput(f)
{
	f = f.replace(/^(\d*).(\d*).(\d*)$/, "$3\-$2\-$1");
	//$date =~ s/^(\d*).(\d*).(\d*)$/$3-$2-$1/;
	if (f == "") { f = "0000-00-00"; }
	return f;

	//if( f.match(/^\d{1,4}\.\d{1,2}\.\d{1,5}$/)) return true;
	//return false;
}

