	// ============================================================================================================
  // JavaScript full form or single filed validation
	// ============================================================================================================
  //
  // Just follow these rules ...
  //
  // 1) Required field validation needs a pair of form field 'name' and hidden field 'r_name'
  //    HTML EXAMPLE:   <input type="text" name="your_fieldname">
  //                    <input type="hidden" name="r_your_fieldname" value="Required error message goes here">
  // 2) Integer field validation needs a pair of form field 'name' and hidden field 'i_name'
  //    STRUTS EXAMPLE: <html:text property="your_fieldname"/>
 	//                    <html:hidden property="i_your_fieldname" value="your_fieldname must be a number value"/>
  // 3) Date field validation needs a pair of form field 'name' and hidden field 'd_name'
  // 4) Email field validation needs a pair of form field 'name' and hidden field 'e_name'
  //
  // inspired by http://members.aol.com/perflunk/validation.html - Art Lubin / Artswork - mailto:perflunk@aol.com

	var new_fieldname = ""
	
	// ===== Validation of the whole form (to be called as last onclick method of a submit button) =====
	function check(form, errortext, leaveout) {
	  var x = form.elements.length
	  var message = ""
	  var more_message = ""
	  var showmsg = "no"
	  var fieldsToStepOver = "," + leaveout + ","
	  x = x - 1
	  for (var i = 0; i <= x; i++) {
	    var messenger = form.elements[i].name
	    messenger = messenger.substring(0, 2)
	    var fieldname = form.elements[i].name
	    fieldname = fieldname.substring(2)
	
	    if (fieldsToStepOver.indexOf("," + fieldname + ",") == -1) {
			  if (messenger == "r_") {
			    more_message = r_check(form,x,fieldname,i)
			  }
			  else if (messenger == "i_") {
		      more_message = i_check(form,x,fieldname,i)
		    }
		    else if (messenger == "d_") {
		      more_message = d_check(form,x,fieldname,i)
		    }
		    else if (messenger == "e_") {
		      more_message = e_check(form,x,fieldname,i)
		    }      
		    
		    if (more_message != "") {
		      more_message = "- " + more_message
		      if (message == "") {
		        message = more_message
				  } else {
		        message = message + "\n" + more_message
		      }
          more_message = ""
		    }
		                    
		    if (message > "") {
		      showmsg = "yes"
		    }
		  }
	  }
	  
	  
	  // prevent a submit if data is incorrect
	  if (showmsg == "yes") {
	    alert( errortext + "\n\n"
	    			+ message , "XYZ")
	    return false
	  }
	  else  {
	    return true
	  }
	}  

	
	// ===== Validation of a single integer field (to be called as last onclick method of a submit button) =====
	function checkInteger(form,fieldname)  {
	  var max = form.elements.length
	  var errorindex = -1
		for (var i = 0; i <= max; i++) {
      if (form.elements[i].name == "i_" + fieldname) {
	      errorindex = i
	      break
	    }
	  }
	  
	  if (errorindex > -1) {
  		var msg = i_check(form,form.elements.length,fieldname,errorindex)
  		
		  // prevent a submit if data is incoorect
		  if (msg > "") {
		    alert(msg + "\n\n Please correct the field and submit again.")
		    return false
		  }
		  else  {
		    return true
		  }
	  }
	  return true
	}          


	// ===== Validation of a single date field (to be called as last onclick method of a submit button) =====
	function checkDate(form,fieldname)  {
	  var max = form.elements.length
	  var errorindex = -1
		for (var i = 0; i <= max; i++) {
      if (form.elements[i].name == "d_" + fieldname) {
	      errorindex = i
	      break
	    }
	  }
	  
	  if (errorindex > -1) {
  		var msg = d_check(form,form.elements.length,fieldname,errorindex)
  		
		  // prevent a submit if data is incoorect
		  if (msg > "") {
		    alert(msg + "\n\n Please correct the field and submit again.")
		    return false
		  }
		  else  {
		    return true
		  }
	  }
		return true
	}          
	    
	    
	// ===== Validation of a single email field (to be called as last onclick method of a submit button) =====
	function checkEmail(form,fieldname)  {
	  var max = form.elements.length
	  var errorindex = -1
		for (var i = 0; i <= max; i++) {
      if (form.elements[i].name == "e_" + fieldname) {
	      errorindex = i
	      break
	    }
	  }
	  
	  if (errorindex > -1) {
  		var msg = e_check(form,form.elements.length,fieldname,errorindex)
  		
		  // prevent a submit if data is incoorect
		  if (msg > "") {
		    alert(msg + "\n\n Please correct the field and submit again.")
		    return false
		  }
		  else  {
		    return true
		  }
	  }
		return true
	}          
	    

	// ===== Validation of a single required field (to be called as last onclick method of a submit button) =====
	function checkRequired(form,fieldname)  {
	  var max = form.elements.length
	  var errorindex = -1
		for (var i = 0; i <= max; i++) {
      if (form.elements[i].name == "r_" + fieldname) {
	      errorindex = i
	      break
	    }
	  }
	  
	  if (errorindex > -1) {
  		var msg = r_check(form,form.elements.length,fieldname,errorindex)
  		
		  // prevent a submit if data is incoorect
		  if (msg > "") {
		    alert(msg + "\n\n Please correct the field and submit again.")
		    return false
		  }
		  else  {
		    return true
		  }
	  }
		return true
	}          
	    
	// ============================================================================================================
	// basic check routines
	// ============================================================================================================
	      
	// ===== Required field validation (needs a pair of form field 'name' and hidden field 'r_name') =====
	function r_check(form,x,fieldname,i) {
		var msg_addition = ""
		new_fieldname = fieldname
		for (var y = 0; y <= x; y++) {
		  if ((form.elements[y].type == "radio" || form.elements[y].type == "checkbox") 
		      && form.elements[y].name == new_fieldname 
		      && form.elements[y].checked == true) {
			  msg_addition = ""
			  break
		  } else if ((form.elements[y].type == "radio" || form.elements[y].type == "checkbox") 
		             && form.elements[y].name == new_fieldname 
		             && form.elements[y].checked == false) {
		    msg_addition = form.elements[i].value
		  } else if (form.elements[y].type == "select-one") {
		    var l = form.elements[y].selectedIndex
		    if (form.elements[y].name == fieldname && form.elements[y].options[l].value != "") {
			    msg_addition = ""
			    break
		    } else if (form.elements[y].name == fieldname && form.elements[y].options[l].value == "") {
			    msg_addition = form.elements[i].value
		    }
		  } else if (form.elements[y].name == fieldname 
		             && form.elements[y].value == "" 
		             && form.elements[y].type != "radio" 
		             && form.elements[y].type != "checkbox" 
		             && form.elements[y].type != "select-one") {
		    msg_addition = form.elements[i].value
		    break
		  } else if (form.elements[y].name == fieldname 
		             && form.elements[y].value != "" 
		             && form.elements[y].type != "radio" 
		             && form.elements[y].type != "checkbox" 
		             && form.elements[y].type != "select-one") {
		    msg_addition = ""
	    }  
	  }
	  return(msg_addition)
	}

	// ===== Integer field validation (needs a pair of form field 'name' and hidden field 'i_name') =====
	function i_check(form,x,fieldname,i)  {
		for (var y = 0; y <= x; y++) {
	    if (form.elements[y].name == fieldname)
	    break
	  }            
	  
	  var msg_addition = ""
	  var decimal = ""
	  inputStr = form.elements[y].value.toString()
	  
	  if (inputStr == "") {
		  msg_addition = form.elements[i].value
	  } else {
		  for (var c = 0; c < inputStr.length; c++) {
	      var oneChar = inputStr.charAt(c)
	      if (c == 0 && oneChar == "-" || oneChar == "."  && decimal == "") {
	        if (oneChar == ".") {
		        decimal = "yes"
	        }
	        continue
	      }
	      if (oneChar < "0" || oneChar > "9") {
	        msg_addition = form.elements[i].value
	      }
	    }
	  }
	  return(msg_addition)
	}  
	  
	  
	// ===== E-Mail field validation (needs a pair of form field 'name' and hidden field 'e_name') =====
	function e_check(form,x,fieldname,i) {
		
		for (var y = 0; y <= x; y++) {
	    if (form.elements[y].name == fieldname)
	    break
	  }            
	    
	  var msg_addition = ""
	  period = ".";
	
	
		if (form.elements[y].value == "") {
			error = 0;
			return("");
		}
	
	  if (form.elements[y].value.indexOf ('@', 0) < 1) {
	    error = 1;
	  } else {
	    atpos = form.elements[y].value.indexOf ('@', 0)
	    ptpos = form.elements[y].value.indexOf('.', atpos)
	    if (ptpos - atpos > 1) {
		    error = 0;
	    } else {
	      error = 1;
	    }
	  }
	  
	  if (error == 1) {
	    msg_addition = form.elements[i].value
	  } else {
	    if (form.elements[y].value.length - ptpos > 1) {
	      msg_addition = ""
	    } else {
	      msg_addition = form.elements[i].value;
	    }
	  }
	  return(msg_addition)
	}  
	
	
	// ===== Date field validation (needs a pair of form field 'name' and hidden field 'd_name') =====
	// date must be in DD.MM.YYYY (eg. 24.11.2004) format or DD.MMM YYYY (e.g. 24. Nov 2004) format
	function d_check(form,x,fieldname,i) {
	   // checking of dates disabled, cannot emulate java parsing rules for all locales in javascript
	  return ""; // TODO: needs to be removed completely
	  
	
	  for (var y = 0; y <= x; y++) {
	    if (form.elements[y].name == fieldname)
	    break
	  }    
	      
	  var msg_addition = ""  
	  var sDate = form.elements[y].value
	  var errMsg = form.elements[i].value
	    
	  // to allow NO validation unless r_ specified
	  if (sDate != "") {
	    // split the date into its three parts
	    var day = ""
	    var month = ""
	    var year = ""
	    var part = ""
      inputStr = sDate.toString()
      
      // DDMMYY or DDMMYYYY
      if ((inputStr.length == 6) || (inputStr.length == 8)) {
      
      	day = inputStr.substring(0,2)
      	
      	month = inputStr.substring(2,4)
      	
      	year = inputStr.substring(4,inputStr.length)
            
      	if (year.length == 2) {    	
      		year = "20" + year
      	}
      	
      } else {
      
				for (var p = 0; p < inputStr.length; p++) {
				  var oneChar = inputStr.charAt(p)
			    if (oneChar == ".") {
				    if (day == "") {
				      day = part
				    } else if (month == "") {
				      month = part
				    }
				    part = ""
				  } else if (oneChar == " ") {
				    if (day == "") {
				      day = part
				    } else if (month == "") {
				      month = part
				    }
				    part = ""
			    } else {
				    part = part + oneChar
				  }
			  }
			  year = part;
			}
		  // get three parts (day, month year) as integer values
		  var dayInt = day * 1;
      var monthInt = month * 1;
      var yearInt = year * 1;
      
      if (isNaN(monthInt)) {
        var monthStr = month.toString().toUpperCase()
        if (monthStr == "JAN") monthInt = 1
        if (monthStr == "FEB") monthInt = 2
        if (monthStr == "MAR") monthInt = 3
        if (monthStr == "APR") monthInt = 4
        if (monthStr == "MAY") monthInt = 5
        if (monthStr == "JUN") monthInt = 6
        if (monthStr == "JUL") monthInt = 7
        if (monthStr == "AUG") monthInt = 8
        if (monthStr == "SEP") monthInt = 9
        if (monthStr == "OCT") monthInt = 10
        if (monthStr == "NOV") monthInt = 11
        if (monthStr == "DEC") monthInt = 12
      }
      
      if (isNaN(dayInt) || isNaN(monthInt) || isNaN(yearInt)) {
        msg_addition = errMsg;
      }

		  // check the ranges of the three parts
      if ((dayInt <= 0) || (monthInt <= 0) || (monthInt > 12) || (yearInt <= 1900) || (yearInt > 9999)) {
        msg_addition = errMsg;
      }
      
      var febDays = 28
      if (yearInt % 4 == 0) {
        febDays = 29;
        if (yearInt % 100 == 0) {
          febDays = 28;
          if (yearInt % 400 == 0) {
            febDays = 29;
          }  
		    } 
		  }
		  
		  if ((dayInt > 31) && (monthInt == 1)) msg_addition = errMsg;
		  if ((dayInt > febDays) && (monthInt == 2)) msg_addition = errMsg;
		  if ((dayInt > 31) && (monthInt == 3)) msg_addition = errMsg;
		  if ((dayInt > 30) && (monthInt == 4)) msg_addition = errMsg;
		  if ((dayInt > 31) && (monthInt == 5)) msg_addition = errMsg;
		  if ((dayInt > 30) && (monthInt == 6)) msg_addition = errMsg;
		  if ((dayInt > 31) && (monthInt == 7)) msg_addition = errMsg;
		  if ((dayInt > 31) && (monthInt == 8)) msg_addition = errMsg;
		  if ((dayInt > 30) && (monthInt == 9)) msg_addition = errMsg;
		  if ((dayInt > 31) && (monthInt == 10)) msg_addition = errMsg;
		  if ((dayInt > 30) && (monthInt == 11)) msg_addition = errMsg;
		  if ((dayInt > 31) && (monthInt == 12)) msg_addition = errMsg;
	  }
	  
	  return(msg_addition)
	}

	// ============================================================================================================
	// helper functions
	// ============================================================================================================
	
	function isInteger(sDate) {
		var new_msg = "true"
		inputStr = sDate.toString()
		for (var i = 0; i < inputStr.length; i++) {
		  var oneChar = inputStr.charAt(i)      
	    if ((oneChar < "0" || oneChar > "9") && oneChar != ".") {
		    new_msg = "false"
	    }
	  }
	  return (new_msg)
	}
	
	function asc(each_char) {
	  var n = 0
	  var char_str = charSetStr()
	  for (i = 0; i < char_str.length; i++) {
	    if (each_char == char_str.substring(i, i+1)) {
	      break
	    }
	  }
	  return i + 32
	}
	    
	function charSetStr() {
	  var str
	  str = ' !"#$%&' + "'" + '()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
	  return str
	}

	