/************************************************************************
** Author: Jason Kaler
** Company: Jeomil (www.jeomil.com)
** Date : 2003-08-12
** Purpose : Generic validation of forms
*************************************************************************
*/
// doValidate() iterates through aform, checking for validate attributes
// validate properties may be specified AFTER the form, as follows:
// document.form1.text1.validate='display_name;currency;compulsory';

// defining the comparison types

var reEmail = /^.+\@.+\..+$/
var reFloat = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/
var reInteger = /^\d+$/
var reCurr = /^\d*(\.\d\d)?$/
var reLink = /^http:\/\/|https:\/\/.+$/
var reTime= /^([0-1]\d|2[0-3]):[0-5]\d$/

//**************************************************************************************************
//a trim function for javascript
String.prototype.trim = function() {
var trimmed;
trimmed = this.replace(/^\s+/, '');
return trimmed.replace(/\s+$/, '');
};

// ************************************************************************************************
// does filtering for lookup fields
// ************************************************************************************************//filter list arraysvar selects=new Array();
function Filterlist(val,listobj)
{
	if(!selects[listobj])
	selects[listobj]=new List(document.all[listobj]);
	selects[listobj].filter(val);
}
function List(selectobj)
{
	this.options=new Array();
	for(var i=0;i<selectobj.options.length;i++)
	{
		this.selectobj=selectobj;
		this.options[i]=new Option();
		
		this.options[i].text=selectobj.options[i].text;
		this.options[i].value=selectobj.options[i].value;	
		this.options[i].parent=selectobj.options[i].parentid;
	}

	this.filter=function(val)
	{
		var index=1;
		this.selectobj.options.length=0;
		this.selectobj.options[0]=new Option('','',true);
		for (var i=1;i<this.options.length;i++)
		{
			var opt=this.options[i];
			if(opt.parent==val)
			{
			selectobj.options[index++]=new Option(opt.text,opt.value,false);
			}
		}
	}
}

// ************************************************************************************************
// Sending result to previous window
function sendres(field,vle,txt) {
  window.opener.sendValues (field,vle,txt);
  window.close();
}
// ************************************************************************************************
// isEmpty checks if string s is empty
function isEmpty(s)
{
  return ((s == null) || (s.length == 0))}

// ************************************************************************************************
function openwin(aurl) {
  var i=aurl.indexOf (';');
  i>0 ? window.open (aurl.substr(0,i),'',aurl.substr(i+1)) : window.open (aurl,'','location=no,directories=no,status=no,menubar=no,scrollbars=yes ');
}
//**************************************************************************************
//This function checks the value of a field against the values of a list box and returns duplicate values
function checkDuplicate(checkfld,againstfld,disp)
{
	for(var i=0;i<againstfld.options.length;i++)
	{
		if(checkfld.value.toUpperCase().trim()==againstfld.options(i).value.toUpperCase().trim())
			return "A Duplicate of "+disp+" already exists";
	}
	return '';
}
// ************************************************************************************************
function doValidate(aform)
{
  var buffer='';
  var params;
	//alert('a: '+aform.length);
  for (var i=0;i<aform.length;i++) {
    validate=aform[i].lang;
    //alert(aform[i].name+" "+ validate);
    if (validate) {
      props=validate.split(';');
      value=aform[i].value;
      compul=false;
      tester='';

      displays=props[0];
      for (j=1;j<props.length;j++) {
      params=props[j].split(':');
        switch(params[0]){
          case 'compulsory': compul=true; break;
          case 'email': tester=reEmail; testDisp='an Email Address'; break;
          case 'integer': tester=reInteger; testDisp='a whole number'; break;
          case 'float': tester=reFloat; testDisp='a number'; break;
          case 'currency': tester=reCurr; testDisp='a monetary value'; break;
          case 'link':tester=reLink; testDisp=' an external link (stargin with http://'; break;
          case 'force': alert(aform[i].onvals);break;
          case 'password': if (value.length!=32) { aform[i].value=MD5(value) }; break;
          case 'minlength': if ((value.length<10)&&(value.length>0)) { buffer += displays+' must be minimum length of 10.\n' }; break;
          case 'maxlength': if ((value.length>aform[i].maxlength)) { buffer += displays+' exceeds maximum allowed length ('+aform[i].maxlength+') .\n' }; break;
          default: buffer=buffer+displays+':'+props[j]+' is invalid in form\n'; break;
        }
      }

      if (compul&&isEmpty(value)) {
          buffer += 'Please provide '+displays+'.\n';
          aform[i].value='';
      }

      if ((!isEmpty(value))&&(tester!='')) {
        if (!tester.test(value)) {
          buffer += displays+' appears to be invalid.\n';
        }
      }

    }
  }

  if (buffer!='') {
    alert ('The following details could not be processed:\n\n'+buffer);
    event.returnValue=false;
  }
  //event.returnValue=false;
}
//*************converts string dd Mon yyyy to date object**********
function conDate(dt)
{
	if(dt!='')
	{
	var day=dt.split(' ')[0];
	var month=dt.split(' ')[1];
	var year=dt.split(' ')[2];
	var monthnum=0;
	switch (month){
	case 'Jan':monthnum=0;break;
	case 'Feb':monthnum=1;break;
	case 'Mar':monthnum=2;break;
	case 'Apr':monthnum=3;break;
	case 'May':monthnum=4;break;
	case 'Jun':monthnum=5;break;
	case 'Jul':monthnum=6;break;
	case 'Aug':monthnum=7;break;
	case 'Sep':monthnum=8;break;
	case 'Oct':monthnum=9;break;
	case 'Nov':monthnum=10;break;
	case 'Dec':monthnum=11;break;
	}
	var outdate=new Date();
	return outdate.setFullYear(year,monthnum,day);
	}
	else
	return new Date();
}
//***To determine if one date field is before another****************
function getbefore(bfield,afield)
{
		var bf=bfield;
		var af=new Object();
		var aDate;
		if(afield!='today'){
			af=bfield.form[afield];
			aDate=conDate(af.value);
		}
		else{
			aDate=new Date();
			af.lang='Today'
			}
		if(conDate(bf.value)>aDate)
			return bf.lang.split(';')[0]+' must be before '+
			af.lang.split(';')[0]+'. \n';
		else
			return '';
}

//***********************************************************************************************************************
//display an alert before executing delete

//*********************************************************************
function confirmDelete(url)
{
	
     if (confirm("Are you sure about deleting this record?")){
     		  window.open(url+'&confirmationRequest=true','_self');
        }
}

//************************************************************************************************************************
function doValidateSubmit(aform)
{
  var buffer='';
  var params;
	//alert('a: '+aform.length);
  for (var i=0;i<aform.length;i++) {
    validate=aform[i].lang;
    //alert(aform[i].name+" "+ validate);
    if (validate) {
      props=validate.split(';');
      value=aform[i].value;
      compul=false;
      tester='';
		
      displays=props[0];
      for (j=1;j<props.length;j++) {
	     params=props[j].split(':');
        switch(params[0]){
          case 'compulsory': compul=true; break;
          case 'email': tester=reEmail; testDisp='an Email Address'; break;
          case 'integer': tester=reInteger; testDisp='a whole number'; break;
          case 'float': tester=reFloat; testDisp='a number'; break;
          case 'currency': tester=reCurr; testDisp='a monetary value'; break;
          case 'link':tester=reLink; testDisp=' an external link '; break;
          case 'before':buffer+=getbefore(aform[i],params[1]); break;
          case 'fieldname':break;
          case 'time':tester=reTime; testDisp='A valid time 00:00-23:00'; break;
          case 'nodup' : buffer+=checkDuplicate(aform[i],document.getElementById(params[1]),displays); break;
          case 'password': if (value.length!=32) { aform[i].value=MD5(value) }; break;
          case 'minlength': if ((value.length<params[1])&&(value.length>0)) { buffer += displays+' must be minimum length of '+params[1]+'.\n' }; break;
          case 'maxlength': if ((value.length>aform[i].maxlength)) { buffer += displays+' exceeds maximum allowed length ('+aform[i].maxlength+') .\n' }; break;
          default: buffer=buffer+displays+':'+props[j]+' is invalid in form\n'; break;
        }
      }
      if (compul&&isEmpty(value)) {
		  buffer += 'Please provide '+displays+'.\n';
          aform[i].value='';
      }
      if ((!isEmpty(value))&&(tester!='')) {
        if (!tester.test(value)) {
          buffer += displays+' appears to be invalid.\n';
        }
      }
    }
  }
  if (buffer!='') {
    alert ('The following details could not be processed:\n\n'+buffer);
  }
  else{
		aform.submit();
  }
}
//************************************************************************************************************************
/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Copyright (C) Paul Johnston 1999 - 2000.
 * Updated by Greg Holt 2000 - 2001.
 * Updated by Jason - removed add function as this script will only be used in IE 5 +
 */

/*
 * Convert a 32-bit number to a hex string with ls-byte first
 */
var hex_chr = "0123456789abcdef";
function rhex(num)
{
  str = "";
  for(j = 0; j <= 3; j++)
    str += hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) +
           hex_chr.charAt((num >> (j * 8)) & 0x0F);
  return str;
}

//************************************************************************************************************************
/*
 * Convert a string to a sequence of 16-word blocks, stored as an array.
 * Append padding bits and the length, as described in the MD5 standard.
 */
function str2blks_MD5(str)
{
  nblk = ((str.length + 8) >> 6) + 1;
  blks = new Array(nblk * 16);
  for(i = 0; i < nblk * 16; i++) blks[i] = 0;
  for(i = 0; i < str.length; i++)
    blks[i >> 2] |= str.charCodeAt(i) << ((i % 4) * 8);
  blks[i >> 2] |= 0x80 << ((i % 4) * 8);
  blks[nblk * 16 - 2] = str.length * 8;
  return blks;
}

//************************************************************************************************************************
/*
 * Bitwise rotate a 32-bit number to the left
 */
function rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}

/*
 * These functions implement the basic operation for each round of the
 * algorithm.
 */
function cmn(q, a, b, x, s, t)
{
  return (rol(((a + q) + (x + t)), s) + b);
}
function ff(a, b, c, d, x, s, t)
{
  return cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function gg(a, b, c, d, x, s, t)
{
  return cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function hh(a, b, c, d, x, s, t)
{
  return cmn(b ^ c ^ d, a, b, x, s, t);
}
function ii(a, b, c, d, x, s, t)
{
  return cmn(c ^ (b | (~d)), a, b, x, s, t);
}

/*
 * Take a string and return the hex representation of its MD5.
 */
function MD5(str)
{
  x = str2blks_MD5(str);
  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;
 
  for(var i = 0; i < x.length; i += 16)
  {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;

    a = ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    d = ff(d, a, b, c, x[i+ 1], 12, -389564586);
    c = ff(c, d, a, b, x[i+ 2], 17,  606105819);
    b = ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    a = ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    d = ff(d, a, b, c, x[i+ 5], 12,  1200080426);
    c = ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    b = ff(b, c, d, a, x[i+ 7], 22, -45705983);
    a = ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    d = ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    c = ff(c, d, a, b, x[i+10], 17, -42063);
    b = ff(b, c, d, a, x[i+11], 22, -1990404162);
    a = ff(a, b, c, d, x[i+12], 7 ,  1804603682);
    d = ff(d, a, b, c, x[i+13], 12, -40341101);
    c = ff(c, d, a, b, x[i+14], 17, -1502002290);
    b = ff(b, c, d, a, x[i+15], 22,  1236535329);    

    a = gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    d = gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    c = gg(c, d, a, b, x[i+11], 14,  643717713);
    b = gg(b, c, d, a, x[i+ 0], 20, -373897302);
    a = gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    d = gg(d, a, b, c, x[i+10], 9 ,  38016083);
    c = gg(c, d, a, b, x[i+15], 14, -660478335);
    b = gg(b, c, d, a, x[i+ 4], 20, -405537848);
    a = gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
    d = gg(d, a, b, c, x[i+14], 9 , -1019803690);
    c = gg(c, d, a, b, x[i+ 3], 14, -187363961);
    b = gg(b, c, d, a, x[i+ 8], 20,  1163531501);
    a = gg(a, b, c, d, x[i+13], 5 , -1444681467);
    d = gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    c = gg(c, d, a, b, x[i+ 7], 14,  1735328473);
    b = gg(b, c, d, a, x[i+12], 20, -1926607734);
    
    a = hh(a, b, c, d, x[i+ 5], 4 , -378558);
    d = hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    c = hh(c, d, a, b, x[i+11], 16,  1839030562);
    b = hh(b, c, d, a, x[i+14], 23, -35309556);
    a = hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    d = hh(d, a, b, c, x[i+ 4], 11,  1272893353);
    c = hh(c, d, a, b, x[i+ 7], 16, -155497632);
    b = hh(b, c, d, a, x[i+10], 23, -1094730640);
    a = hh(a, b, c, d, x[i+13], 4 ,  681279174);
    d = hh(d, a, b, c, x[i+ 0], 11, -358537222);
    c = hh(c, d, a, b, x[i+ 3], 16, -722521979);
    b = hh(b, c, d, a, x[i+ 6], 23,  76029189);
    a = hh(a, b, c, d, x[i+ 9], 4 , -640364487);
    d = hh(d, a, b, c, x[i+12], 11, -421815835);
    c = hh(c, d, a, b, x[i+15], 16,  530742520);
    b = hh(b, c, d, a, x[i+ 2], 23, -995338651);

    a = ii(a, b, c, d, x[i+ 0], 6 , -198630844);
    d = ii(d, a, b, c, x[i+ 7], 10,  1126891415);
    c = ii(c, d, a, b, x[i+14], 15, -1416354905);
    b = ii(b, c, d, a, x[i+ 5], 21, -57434055);
    a = ii(a, b, c, d, x[i+12], 6 ,  1700485571);
    d = ii(d, a, b, c, x[i+ 3], 10, -1894986606);
    c = ii(c, d, a, b, x[i+10], 15, -1051523);
    b = ii(b, c, d, a, x[i+ 1], 21, -2054922799);
    a = ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
    d = ii(d, a, b, c, x[i+15], 10, -30611744);
    c = ii(c, d, a, b, x[i+ 6], 15, -1560198380);
    b = ii(b, c, d, a, x[i+13], 21,  1309151649);
    a = ii(a, b, c, d, x[i+ 4], 6 , -145523070);
    d = ii(d, a, b, c, x[i+11], 10, -1120210379);
    c = ii(c, d, a, b, x[i+ 2], 15,  718787259);
    b = ii(b, c, d, a, x[i+ 9], 21, -343485551);

    a = (a + olda);
    b = (b + oldb);
    c = (c + oldc);
    d = (d + oldd);
  }
  return rhex(a) + rhex(b) + rhex(c) + rhex(d);
}
 
function sendres(field,vle,txt) {
  window.opener.sendValues (field,vle,txt);
  window.close();
}