/** 
	#*****************************************************************************
	#
	# app.js
	#
	# Author: 		Denis Roy
	#
	# Description: Application-wide JavaScript functions
	#
	# HISTORY:
	#
	#****************************************************************************
*/
popup_size_x = 600;
popup_size_y = 450;

function fnSetOrderBy(_orderby) {
	if(document.form1.orderby.value == _orderby) {
		if(document.form1.orderbymode.value == " ASC") {
			document.form1.orderbymode.value = " DESC";
		}
		else {
			document.form1.orderbymode.value = " ASC";
		}
	}
	else {
		document.form1.orderbymode.value = " ASC";
	}
	
	document.form1.orderby.value = _orderby;
	
	document.form1.state.value = "";
	document.form1.submit();
}

function fnSetSortArrow() {
	objImage = document.getElementById(document.form1.orderby.value);

	if(typeof(objImage) != "undefined") {
		if(document.form1.orderbymode.value == " ASC") {
			objImage.src = "../images/ico_sort_down.gif";
		}
		else {
			objImage.src = "../images/ico_sort_up.gif";
		}
	}
}



function isPostalCode(_val)
{
	if(_val == "") 
	{
		return true;
	}
	else
	{
		regExp = regExp=/^[A-Z]\d[A-Z]\s\d[A-Z]\d$/;
		return regExp.test(_val);	
	}
}


function isNum(_val)
{
	if (_val == "")
	{
		return false
	}

	return !(isNaN(_val));
}

function isFloat(_val)
{
	if (_val == "")
	{
		return false
	}

	regExpPositive = /^(\d{1,}(\.\d{1,}|)|\.\d{1,})$/;
	regExpNegative = /^-(\d{1,}(\.\d{1,}|)|\.\d{1,})$/;
	
	return (regExpPositive.test(_val) | regExpNegative.test(_val));
}



function isEmpty(_val)
{
	return _val == "";		
}

function isDate(_val)
{
	// format: aaaa-mm-jj | aaaa-m-j 
	regExp = /^\d{4}-(0[1-9]|[1-9]|1[012])-(3[01]|[1-9]|[012]\d)$/;
	
	return regExp.test(_val);
}

function isEmail(_val)
{
	// format: b@b.ca
	// Intensif sur CPU client-side
	if(_val.length < 25)
	{
		regExp = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/;
	}
	else
	{
		regExp = /@/;
	}
	return regExp.test(_val);
}

function isDateAfter ( ddd , ddf )
{
	//Valide si la date de fin est sup�rieur ou �gale � la date de debut
	if ( ddd != "" && ddf != "" )
	{
		var annee_ddd = ddd.substring ( 0 , 4 ) ;
		var mois_ddd = ddd.substring ( 5 , 7 ) ;
		var jours_ddd = ddd.substring ( 8 , 10 ) ;

		var annee_ddf = ddf.substring ( 0 , 4 ) ;
		var mois_ddf = ddf.substring ( 5 , 7 ) ;
		var jours_ddf = ddf.substring ( 8 , 10 ) ;

		var date_ddd = new Date(annee_ddd , mois_ddd , jours_ddd );//yy,mm,dd
		var date_ddf = new Date(annee_ddf , mois_ddf , jours_ddf );//yy,mm,dd

		if (date_ddf.getTime() >= date_ddd.getTime())
		{ // la date de fin est sup�rieure ou �gale � la date de d�but
			return true ;
		}
		else
		{ // la date de fin n'est pas sup�rieure ou �gale � la date de d�but
			return false ;
		}
	}
	// Si re�oit seulement 1 ou aucune date en param�tres.
	return true ;
}


function isSIN(_val)
{
	rValue = false;
	sum = 0;
	val = 0;
	num = new Array();
	
	regExp = /^\d{9}$/; 
	if(regExp.test(_val))
	{
		for(i=0;i<9;i++)
		{
			num[i] = _val.charAt(i);
		}	
	
		for (i=1; i<9; ++i )
		{
			val = num[i-1] - '0';
			val *= (i%2==1 ) ? 1 : 2;
			if ( val > 9 )
  	   	    {
      	  		val = parseInt(val / 10 ) + ( val % 10);
			}			 
		    sum += val;
   		}    
    	rValue = (10 - (sum % 10 ) ) % 10 == (num[8] - '0');
	}

	return rValue;
}

function centerPopup() {
	var x = screen.width / 2 - popup_size_x / 2;
	var y = screen.height / 2 - popup_size_y / 2;
	window.moveTo(x, y);
	window.focus();
}