//--------------------
// Popus and Windows
//--------------------

	
	// Popup Window
	function popupwindow(path,width,height,top,left)
		{
		window.open (path, "privacy", "resizable=0,menubar=0,toolbar=0,scrollbars=0, width="+width+",height="+height+",top="+top+",left="+left);
		}

//--------------------
// Number Functions
//--------------------

	// Numeric Rounding
	function round(number,X) {
		// rounds number to X decimal places, defaults to 2
		X = (!X ? 2 : X);
		return Math.round(number*Math.pow(10,X))/Math.pow(10,X);
	}

//--------------------
// String Functions
//--------------------

	// Remove Carriage Returns
	function CarriageReturns (strToEncode)
		{
		  var strCRLF = String.fromCharCode(13,10);
		  var strLeft;
		  var strRight;
		  var intCRLF = strToEncode.indexOf(strCRLF);
		  var strDelimChars = String.fromCharCode(24);
		  while (intCRLF != -1) {
			if (intCRLF > 0)
			  var strLeft = strToEncode.substring(0, intCRLF);
			if (intCRLF < strToEncode.length - 1)
			  var strRight = strToEncode.substring(intCRLF + 2, strToEncode.length);
			strToEncode = strLeft + strDelimChars + strRight;
			intCRLF = strToEncode.indexOf(strCRLF);
		  }
		  return strToEncode;
		}
		
	function rightTrim( strValue ) {
	
	var objRegExp = /^([\w\W]*)(\b\s*)$/;
	
		  if(objRegExp.test(strValue)) {
		   //remove trailing a whitespace characters
		   strValue = strValue.replace(objRegExp, '$1');
		}
	  return strValue;
	}
	
	function leftTrim( strValue ) {
	
	var objRegExp = /^(\s*)(\b[\w\W]*)$/;
	
		  if(objRegExp.test(strValue)) {
		   //remove leading a whitespace characters
		   strValue = strValue.replace(objRegExp, '$2');
		}
	  return strValue;
	}
	
	function trimAll( strValue ) {
	
	 var objRegExp = /^(\s*)$/;
	
		if(objRegExp.test(strValue)) {
		   strValue = strValue.replace(objRegExp, '');
		   if( strValue.length == 0)
			  return strValue;
		}
	
	   objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
	   if(objRegExp.test(strValue)) {
		   strValue = strValue.replace(objRegExp, '$2');
		}
	  return strValue;
	}		
	
	function removeCommas( strValue ) {
	  var objRegExp = /,/g; 
	
	  return strValue.replace(objRegExp,'');
	}
	
	function addCommas( strValue ) {
	  var objRegExp  = new RegExp('(-?[0-9]+)([0-9]{3})');
	
		while(objRegExp.test(strValue)) {
		   strValue = strValue.replace(objRegExp, '$1,$2');
		}
	  return strValue;
	}
	
	function removeCharacters( strValue, strMatchPattern ) {
	
	 var objRegExp =  new RegExp( strMatchPattern, 'gi' );
	
	  return strValue.replace(objRegExp,'');
	}	

//--------------------
// Date and Time Functions
//--------------------
	
	var NUM_CENTYEAR = 30;
	var BUL_TIMECOMPONENT = false;
	var BUL_YEARSCROLL = true;
	
	var calendars = [];
	var RE_NUM = /^\-?\d+$/;
	
	function calendar2(obj_target) {
	
		this.gen_date = cal_gen_date2;
		this.gen_time = cal_gen_time2;
		this.gen_tsmp = cal_gen_tsmp2;
		this.prs_date = cal_prs_date2;
		this.prs_time = cal_prs_time2;
		this.prs_tsmp = cal_prs_tsmp2;
		this.popup    = cal_popup2;
	
		if (!obj_target)
			return cal_error("Error calling the calendar: no target control specified");
		if (obj_target.value == null)
			return cal_error("Error calling the calendar: parameter specified is not valid tardet control");
		this.target = obj_target;
		this.time_comp = BUL_TIMECOMPONENT;
		this.year_scroll = BUL_YEARSCROLL;
		
		this.id = calendars.length;
		calendars[this.id] = this;
	}
	
	function cal_popup2 (str_datetime) {
		this.dt_current = this.prs_tsmp(str_datetime ? str_datetime : this.target.value);
		if (!this.dt_current) return;
	
		var obj_calwindow = window.open(
			'/system/calendar.asp?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id,
			'Calendar', 'width=200,height='+(this.time_comp ? 215 : 190)+
			',status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes'
		);
		obj_calwindow.opener = window;
		obj_calwindow.focus();
	}
	
	function cal_gen_tsmp2 (dt_datetime) {
		return(this.gen_date(dt_datetime) + ' ' + this.gen_time(dt_datetime));
	}
	
	function cal_gen_date2 (dt_datetime) {
		return (
			(dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "/"
			+ (dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate() + "/"
			+ dt_datetime.getFullYear()
		);
	}
	function cal_gen_time2 (dt_datetime) {
		return (
			(dt_datetime.getHours() < 10 ? '0' : '') + dt_datetime.getHours() + ":"
			+ (dt_datetime.getMinutes() < 10 ? '0' : '') + (dt_datetime.getMinutes()) + ":"
			+ (dt_datetime.getSeconds() < 10 ? '0' : '') + (dt_datetime.getSeconds())
		);
	}
	
	// timestamp parsing function
	function cal_prs_tsmp2 (str_datetime) {
		// if no parameter specified return current timestamp
		if (!str_datetime)
			return (new Date());
	
		// if positive integer treat as milliseconds from epoch
		if (RE_NUM.exec(str_datetime))
			return new Date(str_datetime);
			
		// else treat as date in string format
		var arr_datetime = str_datetime.split(' ');
		return this.prs_time(arr_datetime[1], this.prs_date(arr_datetime[0]));
	}
	
	// date parsing function
	function cal_prs_date2 (str_date) {
	
		var arr_date = str_date.split('/');
	
		if (arr_date.length != 3) return alert ("Invalid date format: '" + str_date + "'.\nFormat accepted is dd-mm-yyyy.");
		if (!arr_date[1]) return alert ("Invalid date format: '" + str_date + "'.\nNo day of month value can be found.");
		if (!RE_NUM.exec(arr_date[1])) return alert ("Invalid day of month value: '" + arr_date[1] + "'.\nAllowed values are unsigned integers.");
		if (!arr_date[0]) return alert ("Invalid date format: '" + str_date + "'.\nNo month value can be found.");
		if (!RE_NUM.exec(arr_date[0])) return alert ("Invalid month value: '" + arr_date[0] + "'.\nAllowed values are unsigned integers.");
		if (!arr_date[2]) return alert ("Invalid date format: '" + str_date + "'.\nNo year value can be found.");
		if (!RE_NUM.exec(arr_date[2])) return alert ("Invalid year value: '" + arr_date[2] + "'.\nAllowed values are unsigned integers.");
	
		var dt_date = new Date();
		dt_date.setDate(1);
	
		if (arr_date[0] < 1 || arr_date[0] > 12) return alert ("Invalid month value: '" + arr_date[0] + "'.\nAllowed range is 01-12.");
		dt_date.setMonth(arr_date[0]-1);
		 
		if (arr_date[2] < 100) arr_date[2] = Number(arr_date[2]) + (arr_date[2] < NUM_CENTYEAR ? 2000 : 1900);
		dt_date.setFullYear(arr_date[2]);
	
		var dt_numdays = new Date(arr_date[2], arr_date[0], 0);
		dt_date.setDate(arr_date[1]);
		if (dt_date.getMonth() != (arr_date[0]-1)) return alert ("Invalid day of month value: '" + arr_date[1] + "'.\nAllowed range is 01-"+dt_numdays.getDate()+".");
	
		return (dt_date)
	}
	
	// time parsing function
	function cal_prs_time2 (str_time, dt_date) {
	
		if (!dt_date) return null;
		var arr_time = String(str_time ? str_time : '').split(':');
	
		if (!arr_time[0]) dt_date.setHours(0);
		else if (RE_NUM.exec(arr_time[0])) 
			if (arr_time[0] < 24) dt_date.setHours(arr_time[0]);
			else return cal_error ("Invalid hours value: '" + arr_time[0] + "'.\nAllowed range is 00-23.");
		else return cal_error ("Invalid hours value: '" + arr_time[0] + "'.\nAllowed values are unsigned integers.");
		
		if (!arr_time[1]) dt_date.setMinutes(0);
		else if (RE_NUM.exec(arr_time[1]))
			if (arr_time[1] < 60) dt_date.setMinutes(arr_time[1]);
			else return cal_error ("Invalid minutes value: '" + arr_time[1] + "'.\nAllowed range is 00-59.");
		else return cal_error ("Invalid minutes value: '" + arr_time[1] + "'.\nAllowed values are unsigned integers.");
	
		if (!arr_time[2]) dt_date.setSeconds(0);
		else if (RE_NUM.exec(arr_time[2]))
			if (arr_time[2] < 60) dt_date.setSeconds(arr_time[2]);
			else return cal_error ("Invalid seconds value: '" + arr_time[2] + "'.\nAllowed range is 00-59.");
		else return cal_error ("Invalid seconds value: '" + arr_time[2] + "'.\nAllowed values are unsigned integers.");
	
		dt_date.setMilliseconds(0);
		return dt_date;
	}
	
	function cal_error (str_message) {
		alert (str_message);
		return null;
	}
	
	var xy = navigator.appVersion; 
	xz = xy.substring(0,4); 
	
	
	function validateUSDate( strValue ) 
		{
		  var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
	
	  if(!objRegExp.test(strValue))
		return false; //doesn't match pattern, bad date
	  else{
		var strSeparator = strValue.substring(2,3) //find date separator
		var arrayDate = strValue.split(strSeparator); //split date into month, day, year
		var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
							'08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
		var intDay = parseInt(arrayDate[1]);
	
		if(arrayLookup[arrayDate[0]] != null) {
		  if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
			return true; //found in lookup table, good date
		}
	
		var intMonth = parseInt(arrayDate[0]);
		if (intMonth == 2) { 
		   var intYear = parseInt(arrayDate[2]);
		   if( ((intYear % 4 == 0 && intDay <= 29) || (intYear % 4 != 0 && intDay <=28)) && intDay !=0)
			  return true; //Feb. had valid number of days
		   }
	  }
	  return false;
	}	

//--------------------
// Email Functions
//--------------------

function validEmailAddress(emailStr) 

	{
	var checkTLD=1;
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=emailStr.match(emailPat);
	
	if (matchArray==null) {
	
	//alert("Email address seems incorrect (check @ and .'s)");
	//alert("Please enter a valid email address!");
	return false;
	}
	var user=matchArray[1];
	var domain=matchArray[2];
	
	for (i=0; i<user.length; i++) {
	if (user.charCodeAt(i)>127) {
	//alert("Ths username contains invalid characters.");
	//alert("Please enter a valid email address!");
	return false;
	   }
	}
	for (i=0; i<domain.length; i++) {
	if (domain.charCodeAt(i)>127) {
	//alert("Ths domain name contains invalid characters.");
	//alert("Please enter a valid email address!");
	return false;
	   }
	}
	
	if (user.match(userPat)==null) {
	//alert("The username doesn't seem to be valid.");
	//alert("Please enter a valid email address!");
	return false;
	}
	
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
	
	for (var i=1;i<=4;i++) {
	if (IPArray[i]>255) {
	//alert("Destination IP address is invalid!");
	//alert("Please enter a valid email address!");
	return false;
	   }
	}
	return true;
	}
	
	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++) {
	if (domArr[i].search(atomPat)==-1) {
	//alert("The domain name does not seem to be valid.");
	//alert("Please enter a valid email address!");
	return false;
	   }
	}
	
	if (checkTLD && domArr[domArr.length-1].length!=2 && 
	domArr[domArr.length-1].search(knownDomsPat)==-1) {
	//alert("The address must end in a well-known domain or two letter " + "country.");
	//alert("Please enter a valid email address!");
	return false;
	}
	if (len<2) {
	//alert("This address is missing a hostname!");
	//alert("Please enter a valid email address!");
	return false;
	}
	
	return true;
	}

//-------------------------------
// General Validation Functions
//-------------------------------

	function validateUSPhone( strValue ) {
	  var objRegExp  = /^\([1-9]\d{2}\)\s?\d{3}\-\d{4}$/;
	
	  return objRegExp.test(strValue);
	}
	
	function  validateNumeric( strValue ) {
	  var objRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
	
	  return objRegExp.test(strValue);
	}
	
	function validateInteger( strValue ) {
	  var objRegExp  = /(^-?\d\d*$)/;
	
	  return objRegExp.test(strValue);
	}
	
	function validateNotEmpty( strValue ) {
	   var strTemp = strValue;
	   strTemp = trimAll(strTemp);
	   if(strTemp.length > 0){
		 return true;
	   }
	   return false;
	}
	
	function validateUSZip( strValue ) {
	var objRegExp  = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
	
	  return objRegExp.test(strValue);
	}
		
	function validateCreditCard(s)
		{
			var v = "0123456789";
			var w = "";
			for (var i=0; i < s.length; i++) {
			x = s.charAt(i);
			if (v.indexOf(x,0) != -1)
			w += x;
			}
			var j = w.length / 2;
			if (j < 6.5 || j > 8 || j == 7) return false;
			var k = Math.floor(j);
			var m = Math.ceil(j) - k;
			var c = 0;
			for (var i=0; i<k; i++) {
			a = w.charAt(i*2+m) * 2;
			c += a > 9 ? Math.floor(a/10 + a%10) : a;
			}
			for (var i=0; i<k+m; i++) c += w.charAt(i*2+1-m) * 1;
			return (c%10 == 0);
		}		

//-------------------------------
// Currency Functions
//-------------------------------

	function removeCurrency( strValue ) 
		{
	  var objRegExp = /\(/;
	  var strMinus = '';
	
	  if(objRegExp.test(strValue)){
		strMinus = '-';
	  }
	
	  objRegExp = /\)|\(|[,]/g;
	  strValue = strValue.replace(objRegExp,'');
	  if(strValue.indexOf('$') >= 0){
		strValue = strValue.substring(1, strValue.length);
	  }
	  return strMinus + strValue;
	}
	
	function addCurrency(strValue) {
	  var objRegExp = /-?[0-9]+\.[0-9]{2}$/;
	
		if( objRegExp.test(strValue)) {
		  objRegExp.compile('^-');
		  strValue = addCommas(strValue);
		  if (objRegExp.test(strValue)){
			strValue = '(' + strValue.replace(objRegExp,'') + ')';
		  }
		  return '$' + strValue;
		}
		else
		  return strValue;
	}	
//-->
