/************************************************************************
** 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 reimg=/^.*(\.(jpg|mpg|gif))$/
var reTime= /^([0-1]\d|2[0-3]):[0-5]\d$/
var rePhone=/^\+\d{0,10} \d{0,20} \d{0,20}$/
var reAscii=/^([\x00-\x80])*$/

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 '';
}
// ************************************************************************************************
function getafter(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 not be before '+af.value+
          '. \n';
    else
    return '';
}
// ************************************************************************************************
function checkVals(fld,forvalue)
{
  var validations=fld.lang.split(';');
  for(var i=1;i<validations.length;i++)
  {
    if((validations[i]==forvalue))
    return true;
  }
  return false;
}
// ************************************************************************************************
function forcecompuslory(field,value,values)
{
  var compel=false;
  var vals;
  vals=values.split(':');
  for(var i=0;i<vals.length;i++)
  {
	  if(value==vals[i] )
    {
      compel=true;  
      break;
    }
  }
  if(compel){
        field.lang+=';compulsory';
        }
  else{
      //field.value='';
      if(checkVals(field,'compulsory')){
        field.lang=field.lang.substring(0,field.lang.indexOf('compulsory')-1);
      }
  }
}
//**********************************************************
function enable_disable(field,value,values)
{
  var vals;
  vals=values.split(':');
  for(var i=0;i<vals.length;i++)
  {
	  if(value==vals[i] )
    {
       field.disabled=false
      return;
    }
  }
  field.disabled=true;
} 

function forcecompuslory(field,value,values,disable)
{
  var compel=false;
  var vals;
  vals=values.split(':');
  for(var i=0;i<vals.length;i++)
  {
	  if(value==vals[i] )
    {
      compel=true;  
      break;
    }
  }
  if(compel){
        field.lang+=';compulsory';
        if (disable)
			field.disabled=false;
        }
  else{
		if (disable)
		{
			field.value='';
			field.disabled=true;
		}
      if(checkVals(field,'compulsory')){
        field.lang=field.lang.substring(0,field.lang.indexOf('compulsory')-1);
      }
  }
}

//**********************************************************
function forceVISAcompuslory(field,value,values)
{
  var compel=false;
  var vals;
  vals=values.split(':');
  for(var i=0;i<vals.length;i++)
  {
	  if(value==vals[i] )
    {
      compel=true;  
      alert('Visas must be valid for 30 days or longer after the departure date from South Africa in order to enter South Africa. If the expiry date on your visa is before 8 April 2007,you have to apply for a new visa, contact your nearest South African Embassy or High Commission.');
      break;
    }
    else
    {
			alert('Please contact your nearest South African Embassy or High Commission in order to obtain a valid entry visa.');
    }
  }
  if(compel){
        field.lang+=';compulsory';
        }
  else{
      //field.value='';
      if(checkVals(field,'compulsory')){
        field.lang=field.lang.substring(0,field.lang.indexOf('compulsory')-1);
      }
  }
}
// ************************************************************************************************
function checkinoculations(field)
{
    if (field==0)
    {
        alert ('To enter South Africa you are required to have certain inoculations. Contact your nearest Travel Clinic to receive the required inoculations.');
    }
}
// ************************************************************************************************
function confirmdelete(url)
{
	if (confirm("Are you sure?"))
	{
		location=url;
	}	
}
// ************************************************************************************************
//filter list arrays
var valarray = new Array;
var txtarray = new Array;
var pararray = new Array;
// ************************************************************************************************
// does filtering for lookup fields
function Filterlist(id,flname){
	
	var afld=document.form404[flname];
	//alert(afld.name);
	if (valarray.length>0){
		while (afld.length>1) {
			afld.options.remove(1);
		}
		for (var i=0;i<valarray.length;i++) {
			var oOption = document.createElement("OPTION");
			afld.options.add(oOption);	
			oOption.innerText = txtarray[i];
			oOption.parentid = pararray[i];
			oOption.value = valarray[i];
			//alert(oOption.innerText)
			//alert(afld.options.size);
		}
	}else
	{
		//storing dropdown stuff in arrays
		var i =1;
		var j = 0;
		while (i<afld.length){
			valarray[j]=afld.options[i].value;
			txtarray[j]=afld.options[i].innerText;
			pararray[j]=afld.options[i].parentid;
			j++;
			i++;
		}	
	}
	var i =1;
	while (i<afld.length){
		if (afld.options[i].parentid!=id){
			afld.options.remove(i);
		}else {
			i++;
		}
	}
}
// ************************************************************************************************
// 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 ');
}
// ************************************************************************************************
function doValidate(aform)
{
  var buffer='';
	//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++) {
        switch(props[j]){
          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 'password': if (value.length!=32) { aform[i].value=MD5(value) }; break;
          case 'fieldname':break;
          case 'time':tester=reTime; testDisp='A valid time 00:00-23:00'; 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;
    return false
  }
  else
	return true;
  //event.returnValue=false;
}
//************************************************************************************************************************
function doValidateSubmit(aform)
{
  var buffer='';
	//alert('form fields: '+aform.length);
	dosubmitstuff();
  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 'image': tester=reimg; testDisp='an jpeg,mpeg or gif'; 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 'fieldname':break;
          case 'time':tester=reTime; testDisp='A valid time 00:00-23:59'; break;
          case 'phone':tester=rePhone; testDisp='Valid phone number "Country(0-10) Area(0-20) Phone(0-20)"'; break;
          case 'before':buffer+=getbefore(aform[i],params[1]); break;
          case 'ascii': tester=reAscii; testDisp=aform[i].value.charAt(aform[i].value.search('[^\x00-\x80]'))+' is not a valid character';break;
          case 'after':buffer+=getafter(aform[i],params[1]); 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+' Invalid :'+testDisp;
        }
      }
    }
  }
  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();
}
