// -------	CLIENT SIDE FORM VALIDATION ROUTINES

var nbsp = 160;    // non-breaking space char
var node_text = 3; // DOM text node-type
emptyString = /^\s*$/
// -----------------------------------------
//                  trim
// Trim leading/trailing whitespace off string
// -----------------------------------------

function trim(str)
{
  return str.replace(/^\s+|\s+$/g, '')
};
// -----------------------------------------
//                  msg
// Display warn/error message in HTML element
// commonCheck routine must have previously been called
// -----------------------------------------

function msg(fld,     // id of element to display message in
             msgtype, // class to give element ("warn" or "error")
             message) // string to display
{
  // setting an empty string can give problems if later set to a 
  // non-empty string, so ensure a space present. (For Mozilla and Opera one could 
  // simply use a space, but IE demands something more, like a non-breaking space.)
  var dispmessage;
  if (emptyString.test(message))
  { 
    dispmessage = String.fromCharCode(nbsp);    
 //   fld.style.background= 'alert.gif';	
  }
  else  
  {  
	dispmessage = message;
//    fld.style.background= 'alert.gif';	
  }
  var elem = document.getElementById(fld);
  elem.firstChild.nodeValue = dispmessage;  
  
  elem.className = msgtype;
};

function combo(vfld,ifld,reqd)
{

  var stat = commonCheck (vfld, ifld, reqd);
  if (stat != proceed) return stat;
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
	if (tfld == "NULL") {
		//msg (ifld, "error", "Select a value");
	     vfld.style.backgroundColor = "#FDF8E4";
		vfld.focus();
		return false;
	}
	else if (tfld != "NULL") {
		msg (ifld, "warn", "");
	    vfld.style.backgroundColor = 'white';
		return true;
	}
	return true;
};

// -----------------------------------------
//            commonCheck
// Common code for all validation routines to:
// (a) check for older / less-equipped browsers
// (b) check if empty fields are required
// Returns true (validation passed), 
//         false (validation failed) or 
//         proceed (don't know yet)
// -----------------------------------------
var proceed = 2;  

function commonCheck    (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         reqd)   // true if required
{
  if (!document.getElementById) 
    return true;  // not available on this browser - leave validation to the server
  var elem = document.getElementById(ifld);
  if (!elem.firstChild)
    return true;  // not available on this browser 
  if (elem.firstChild.nodeType != node_text)
    return true;  // ifld is wrong type of node  

  if (emptyString.test(vfld.value)) {
    if (reqd) {
      //msg (ifld, "error", "ERROR: required"); 
	   //ifld.style.backgroundColor = 'blue';
	 // vfld.style.backgroundColor = 'blue';
	  vfld.focus();
      return false;
    }
    else {
     msg (ifld, "warn", "");   // OK
      //vfld.style.backgroundColor = 'green';
	  return true;  
    }
  }
  return proceed;
}
// -----------------------------------------
//            validateNumeric
// Validate if value is numeric no only
// Returns true if so 
// -----------------------------------------
function validateNumeric(vfld,ifld,reqd)
{
	var stat = commonCheck (vfld, ifld, reqd);
	if (stat != proceed )
	{ 
	 	vfld.style.backgroundColor = "#FDF8E4";
		vfld.focus();
		return stat;
	}
	var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
	var i = 0;

	for (i = 0; i < tfld.length; i++)
		if (tfld.charAt(i) < '0' || tfld.charAt(i) > '9') 
		{
			msg (ifld, "error", "ERROR: not a valid number.");
			 vfld.style.backgroundColor = "#FDF8E4";
			vfld.focus();
			return false;
		}
		else
			msg (ifld, "warn", "");
			vfld.style.backgroundColor = "white";
	return true;

};

// -----------------------------------------
//            validate CNIC
// Validate if value is NIC no only
// Returns true if so 
// -----------------------------------------
function validateCNIC(vfld,ifld,len,reqd)
{
  var stat = commonCheck (vfld, ifld, reqd);
  if (stat != proceed ) 
  {
	  if ( reqd == true)
	  {
	  	vfld.style.backgroundColor = "#FDF8E4";
		return stat;
	  }
	  else ( reqd == false)
	  {
		vfld.style.backgroundColor = "white";
		return stat;
	  }
  }
	var length	= len;	
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var telnr = /^\+?[0-9 ()-]+[0-9]$/

//	var telnr = /^\+?[0-9 ()-]+[0-9]$/
  if (!telnr.test(tfld)) {
    msg (ifld, "error", "ERROR: Invalid number.");
   	vfld.style.backgroundColor = "#FDF8E4";
	vfld.focus();
    return false;
  }

  var numdigits = 0;
  for (var j=0; j<tfld.length; j++)
    if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

  if (numdigits<13) {
    msg (ifld, "error", "ERROR: " + numdigits + " digits - too short");
   	vfld.style.backgroundColor = "#FDF8E4";
	vfld.focus();
    return false;
  }

  if (numdigits>13)
  {
    msg (ifld, "warn", numdigits + " digits - check if correct");
	vfld.style.backgroundColor = "#FDF8E4";
  }
  else { 
    if (numdigits<14)
	{
   //   msg (ifld, "warn", "Only " + numdigits + " digits - check if correct");
   // else
      msg (ifld, "warn", "");
  	vfld.style.backgroundColor = "white";
	}
  }
  return true;
};

// -----------------------------------------
//            validatePresent
// Validate if something has been entered
// Returns true if so 
// -----------------------------------------
function validatePresent(vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
						 reqd)
{
  var stat = commonCheck (vfld, ifld, true);
  	if (stat != proceed) 
	{
		vfld.style.backgroundColor = '#FDF8E4'; 
		// ifld.style.background = 'alert.gif'; 
 		return stat;
	}
  	else
	{
	//	msg (ifld, "warn", "");
		vfld.style.backgroundColor = 'white';  
		return true;
	}
};

// -----------------------------------------
//            validateTelnr
// Validate telephone number
// Returns true if so (and also if could not be executed because of old browser)
// Permits spaces, hyphens, brackets and leading +
// -----------------------------------------

function validateTelnr  (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         reqd)   // true if required
{
  var stat = commonCheck (vfld, ifld, reqd);
  if (stat != proceed ) 
  {
	  if ( reqd == true)
	  {
	  	vfld.style.backgroundColor = "#FDF8E4";
		return stat;
	  }
	  else ( reqd == false)
	  {
		vfld.style.backgroundColor = "white";
		return stat;
	  }
  }
	
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var telnr = /^\+?[0-9 ()-]+[0-9]$/
  if (!telnr.test(tfld)) {
    msg (ifld, "error", "ERROR: Invalid number");
   	vfld.style.backgroundColor = "#FDF8E4";
	vfld.focus();
    return false;
  }

  var numdigits = 0;
  for (var j=0; j<tfld.length; j++)
    if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

  if (numdigits<7) {
    msg (ifld, "error", "ERROR: " + numdigits + " digits - too short");
   	vfld.style.backgroundColor = "#FDF8E4";
	vfld.focus();
    return false;
  }

  if (numdigits>7)
  {
    msg (ifld, "error", numdigits + " digits - Wrong Number");
	vfld.style.backgroundColor = "#FDF8E4";
	vfld.focus();
    return false;
  }
  
  return true;
};

// -----------------------------------------
//            validateTelnr2
// Validate telephone number (mobile code)
// Returns true if so (and also if could not be executed because of old browser)
// Permits spaces, hyphens, brackets and leading +
// -----------------------------------------

function validateTelnr2  (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         reqd)   // true if required
{
  var stat = commonCheck (vfld, ifld, reqd);
  if (stat != proceed ) 
  {
	  if ( reqd == true)
	  {
	  	vfld.style.backgroundColor = "#FDF8E4";
		return stat;
	  }
	  else ( reqd == false)
	  {
		vfld.style.backgroundColor = "white";
		return stat;
	  }
  }
	
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var telnr = /^\+?[0-9 ()-]+[0-9]$/
  if (!telnr.test(tfld)) {
    msg (ifld, "error", "ERROR: Invalid number");
   	vfld.style.backgroundColor = "#FDF8E4";
	vfld.focus();
    return false;
  }

  var numdigits = 0;
  for (var j=0; j<tfld.length; j++)
    if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

  if (numdigits<4) {
    msg (ifld, "error2", "ERROR: " + numdigits + " digits - too short");
   	vfld.style.backgroundColor = "#FDF8E4";
	vfld.focus();
    return false;
  }

  if (numdigits>4)
  {
    msg (ifld, "error2", numdigits + " digits - Wrong Number");
	vfld.style.backgroundColor = "#FDF8E4";
	vfld.focus();
    return false;
  }
  
  return true;
};

// -----------------------------------------
//               validateEmail
// Validate if e-mail address
// Returns true if so (and also if could not be executed because of old browser)
// -----------------------------------------

function validateEmail  (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         reqd)   // true if required
{
  var stat = commonCheck (vfld, ifld, reqd);
  	
  if (stat != proceed) 
  {
	vfld.style.backgroundColor = "#FDF8E4";
  	return stat;
  }

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/
  if (!email.test(tfld) || vfld.length <=6) {
    	msg (ifld, "error", "ERROR: not a valid e-mail address");
	 	vfld.style.backgroundColor = "#FDF8E4";
		vfld.focus();
    	return false;
  }

  var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/
  if (!email2.test(tfld)) 
    msg (ifld, "warn", "Unusual e-mail address - check if correct");
  else
    msg (ifld, "warn", "");
	 vfld.style.backgroundColor = "white";
  return true;
};


/* PURPOSE:  Since we are using the single tick mark as the
   string delimiter to construct our SQL queries, a string with
   a tick mark in it will cause a SQL error.  Therefore we replace
   all "'" with "''", which eliminates the possibility of a SQL error.
*/

function sqlSafe (s)
{
   var new_s = s;
   new_s = replaceAll (new_s, "'", "|");
   new_s = replaceAll (new_s, "|", "''");
   new_s = replaceAll (new_s, "\"", "|");
   new_s = replaceAll (new_s, "|", "''");
   return new_s;
}

/****************************************************************/

function makeSafe (i)
{
   i.value = sqlSafe (i.value);
} 


