/*********************************************************************
multi-LANGuage validation script
	version 2.21
	by matthew frank

There are no warranties expressed or implied.  I will not be held
responsible for any loss of data or sanity through the use or
implementation of this script.  This script may be re-used and
distrubted freely provided this header remains intact and all
supporting files are included (unaltered) in the distribution:

	validation.js   - this file
	validation.htm  - example form
	readme.htm      - directions on using this script
	(validation.zip contains all files)

If you are interested in keeping up with the latest releases of this
script or asking questions about its implementation, think about joining
the eGroups discussion forum dedicated to data validation:

	http://www.egroups.com/group/validation

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


/*====================================================================
Function: Err
Purpose:  Custom object constructor
Inputs:   None
Returns:  undefined
====================================================================*/
function Err(){
	/*********************************************************************
	Method:   Err.clear
	Purpose:  Clear values from Error object
	Inputs:   none
	Returns:  undefined
	*********************************************************************/
	this.clear=function (){
		this.source=new Object;
		this.type=new Object;
		this.format=new String;
	}
	/*********************************************************************
	Method:   Err.add
	Purpose:  Adds error to Error object
	Inputs:   oSource - source element object
	          vType   - INTEGER value of error type (or custom string)
	          sFormat - optional DATE format
	Returns:  undefined
	*********************************************************************/
	this.add=function (oSource,vType,sFormat){
		this.source=oSource;
		this.type=vType;
		this.format=sFormat;
	}
	/*********************************************************************
	Method:   Err.raise
	Purpose:  Gives visual warning to user about all errors contained in
	          the Error object
	Inputs:   none
	Returns:  undefined
	*********************************************************************/
	this.raise=function (){
		var oElement=this.source;
		// if type is not a number, it must be a custom error message
		var sMsg=(typeof this.type=="string")?this.type:oElement.getAttribute("MSG");
		if (oElement.getAttribute("DATE")==null)
			oElement.paint();
		if(oElement.select)
			oElement.select();
		if(sMsg)
			alert(sMsg);
		else
			alert(_validation.messages[sLang][this.type]);


		// Perform onvalidatefocus event handler for invalid field
		if(oElement.onvalidatefocus)
			oElement.onvalidatefocus();

		// Give invalid field focus
		oElement.focus();
		// Clear the Err object
		this.clear();
	}

	// Define the working object model
	this.clear();
}

/*====================================================================
Function: Validation
Purpose:  Custom object constructor.
Inputs:   None
Returns:  undefined
====================================================================*/
function Validation(){
	// Define global constants for calls to error message arrays
	this.REQUIRED = 0;
	this.INTEGER  = 1;
	this.FLOAT    = 2;
	this.DATE     = 3;
	this.AMOUNT   = 4;
	this.MASK     = 5;
	this.CCNUMBER = 6;
	this.TURKCELLNO = 7;
	this.DGTURKNO = 8;
	this.SHORTNAME = 9;
	this.NAMESURNAME=10;
	this.AMOUNTWP=11;
	
	
	// Create error message dictionary
	this.messages = new Array;

	// Prototype the DATE tokens for each LANGuage
	Array.prototype.MM = new String;
	Array.prototype.DD = new String;
	Array.prototype.YYYY = new String;

	//Turkish
	this.messages["tr_TR"]=new Array(
		"Lütfen bir değer giriniz",
		"Lütfen geçerli bir tamsayı giriniz",
		"Lütfen geçerli bir kayan noktalı sayı giriniz",
		"Lütfen geçerli bir tarih giriniz",
		"Lütfen geçerli bir parasal tutar giriniz.",
		"Lütfen yandaki formatta bir değer giriniz",
		"Lütfen 16 rakamlı kredi kartı numaranızı giriniz",
		"Lütfen 7 rakamlı turkcell numaranızı giriniz",
		"Lütfen 10 rakamlı digiturk abone numaranızı giriniz",
		"Lütfen \",', ve # karakterlerini içermeyen kısa ad girin",
		"Lütfen isim bilgisini kontrol edin",
		"Lütfen geçerli bir parasal tutar giriniz.");
		
	this.messages["en_US"]=new Array(
		"Please enter a value",
		"Please enter an integer",
		"Please enter a floting point number",
		"Please enter a valid date",
		"Please enter a valid monetary amount",
		"Please enter a value in the followinf format",
		"Please enter your 16 digit credit card number",
		"Please enter your 7 digit Turkcell number",
		"Please enter your 10 digit Digiturk subscription number",
		"Please enter a short name",
		"Please enter a valid name",
		"Please enter a valid monetary amount");		
		

	/*********************************************************************
	Method:   Validation.setDefault
	Purpose:  Set value for variable v if v is zero, empty string or
	          undefined
	Inputs:   v - variable (passed by value)
	          d - default value
	Returns:  v or d
	*********************************************************************/
	this.setDefault=function (v, d){
		return (v)?v:d;
	}
	/********************************************
	Method:   Validation.isNum
	Purpose:  Check that parameter is a number
	Inputs:   v - string value
	Returns:  boolean
	********************************************/
	function isNumber(v){
		return ((v >= 48) && (v <= 57));
	}
	
	function isControlCode(v){
		return ((v == 8) || (v == 37) || (v == 39));
	}

	var digit = new RegExp("[0-9]");
	var shortname  = new RegExp("^[^']*$");
	var shortname2 = new RegExp("^[^\"]*$");
	var shortname3 = new RegExp("^[^\#]*$");
	if (isYTLActive){

  		var reg_amount_trl = new RegExp("[0-9,]");
  	} else {  	

  		var reg_amount_trl = new RegExp("[0-9]");
  	}
	
	var reg_amount_fx = new RegExp("[0-9,]");
	var reg_mixed = new RegExp("[A-Za-zÇçĞğİıÖöŞşÜü ]");
	/*********************************************************************
	Method:   Validation.setup
	Purpose:  Set up methods and event handlers for all forms and elements
	Inputs:   none
	Returns:  undefined
	*********************************************************************/
	this.setup=function (){
		// Fan through forms on page to perform initializations
		var i,iForms=document.forms.length;
		for(i=0; i<iForms; i++){
			var oForm=document.forms[i];
			var oBody=document.body;
			if(!oForm.bProcessed){
				/*********************************************
				Method:   Form.markREQUIRED
				Purpose:  Mark all REQUIRED fields for a form
				Inputs:   none
				Returns:  undefined
				*********************************************/
				oForm.markREQUIRED=function (){
					var i, iElements=this.elements.length;
					var sMarkHTML, sMarkWhere;
					for(i=0; i<iElements; i++){
						var oElement=this.elements[i];
						// Perform onmark event handler
						if(oElement.onmark && oElement.onmark()==false)
							continue;
						if(oElement.getAttribute("REQUIRED")!=null){
							sMarkHTML=this.getAttribute("insert");
							sMarkWhere=this.getAttribute("mark");
							if(sMarkHTML){
								switch(sMarkWhere.toLowerCase()){
									case "before" :
										sMarkWhere="beforeBegin";
										break;
									default :
										sMarkWhere="afterEnd";
								}
								oElement.insertAdjacentHTML(sMarkWhere,sMarkHTML);
							}else{
								var sClassName=oElement.className;
								if(sClassName!="REQUIRED"){
									oElement.setAttribute("nonreqClass",oElement.className);
									oElement.className="REQUIRED";
								}else{
									oElement.className=_validation.setDefault(oElement.getAttribute("nonreqClass"),oElement.className);
									oElement.removeAttribute("nonreqClass");
								}
							}
						}
					}
				}
				var svalidateWhen=oForm.getAttribute("validate");
				var svaliadateBody=oBody.getAttribute("validate");
				if (svalidateWhen!=null || svaliadateBody!=null){
					//
					// Capture and replace onreset and onsubmit event handlers
					//
					oForm.fReset=oForm.onreset;

					// Create new event handlers
					oForm.submitFormVal=function (){
						var i, oElement, iElements=this.elements.length;
						// Restore all elements to original style
						for (i=0; i<iElements; i++)
							this.elements[i].restore();
						// validate individual elements
						for(i=0;i<iElements;i++){
							oElement=this.elements[i];
							// Perform default validation for element
							if (!oElement.valid()){
								_err.raise();
								event.returnValue=false;
								return false;
							}
	
						}

						
						

						// Insert default values just before submit
						var vDefault;
						for(i=0;i<iElements;i++){
							oElement=this.elements[i];
							vDefault=oElement.getAttribute("default");
							if(vDefault && !oElement.value)
								oElement.value=vDefault;
						}
					}
					oForm.onreset=function (){
						var i, iElements=this.elements.length;
						for (i=0; i<iElements; i++)
							this.elements[i].restore();
						// Perform original event handler if present
						if (this.fReset && this.fReset()==false)
								event.returnValue=false;
					}
				}
				oForm.bProcessed=true;
			}
			// Create Input methods
			var j, iElements=oForm.elements.length;
			for(j=0; j<iElements; j++){
				var oElement=oForm.elements[j];
				// Disable onfocus if static field is set
				if ((oElement.getAttribute("static")!=null) && (oElement.getAttribute("static") == true)) {
				oElement.onfocus = function() {
				this.blur();
				}
				}
				if(!oElement.bProcessed) {

					// All event handlers are presumed to be strings/functions
					// at parse-time and assigned only as functions at run-time.

					// Create custom onvalidate event handlers
					var vonvalidate=oElement.getAttribute("onvalidate");
					if(vonvalidate){
						if(typeof vonvalidate!="function")
							oElement.onvalidate=new Function(vonvalidate);
						else
							oElement.onvalidate=vonvalidate;
					}
					// Create custom handler for onvalidatefocus event
					var vonvalidateFocus=oElement.getAttribute("onvalidatefocus");
					if(vonvalidateFocus){
						if(typeof vonvalidateFocus!="function")
							oElement.onvalidatefocus=new Function(vonvalidateFocus);
						else
							oElement.onvalidatefocus=vonvalidateFocus;
					}
					// Custom onmark event handler
					var vOnMark=oElement.getAttribute("onmark");
					if(vOnMark){
						if(typeof vOnMark!="function")
							oElement.onmark=new Function(vOnMark);
						else
							oElement.onmark=vOnMark;
					}
//**				Custom onkeypress filtering AMOUNTFX
					if (oElement.getAttribute("AMOUNTFX")!=null && oElement.getAttribute("AMOUNTFX")){
						oElement.onkeyup = function(){
							this.restore();
							this.value = formatCurrencyFx(this.value); 						
						}
						oElement.onkeypress = function(){
							var sKey=String.fromCharCode(event.keyCode);							
							var INTEGER;
							var decimal = this.value.indexOf(",");
							if (decimal==-1)
							INTEGER = this.value;
							else
							INTEGER = this.value.substring(1,decimal);												
							if ((!(reg_amount_fx.test(sKey) || isControlCode(event.keyCode))) || (INTEGER.length>19))
							{
							event.returnValue = false;
							return false;
							}
							this.onkeyup();							
						}
						oElement.onblur = function(){
							var str = this.value;					
							if (str.substring(str.length-1,str.length)==',') this.value = str.substring(0,str.length-1);  						
							this.value = formatCurrencyFx(this.value);
						}
					}
					// Custom onkeypress filtering AMOUNTTRL
					if (oElement.getAttribute("AMOUNTTRL")!=null && oElement.getAttribute("AMOUNTTRL")){
					
						oElement.onkeyup = function(){				
							
							this.restore();											
							this.value = formatCurrencyTrl(this.value); 	
						}
					
						oElement.onkeypress = function(){
							var sKey=String.fromCharCode(event.keyCode);
							if ((!(reg_amount_trl.test(sKey) || isControlCode(event.keyCode))) || (this.value.length>19))
							{
							event.returnValue = false;
							return false;
							}
							this.onkeyup();
								
						}
						oElement.onblur = function(){
							
							this.value = formatCurrencyTrl(this.value);
						}
					}
					
					// Custom onkeypress filtering AMOUNTWP
					if (oElement.getAttribute("AMOUNTWP")!=null && oElement.getAttribute("AMOUNTWP")){
					   alert("AMOUNTWP");
						
					
						
						oElement.onblur = function(){
							
							this.value = formatCurrencyTrl(this.value);
						}
					}
					
					if (oElement.getAttribute("CCNUMBER")!=null && oElement.getAttribute("CCNUMBER")){
						oElement.onkeypress = function(){
						var amex = this.getAttribute("AMEX");
						var sKey=String.fromCharCode(event.keyCode);
						var maxLength = 19;
						if (amex == true) maxLength = 17;
						if ((!digit.test(sKey))||(this.value.length==maxLength)) {
							event.returnValue=false;
							return false;
							}
							this.onkeyup();							
						}
						oElement.onkeyup = function(){
							this.restore();
							var amex = this.getAttribute("AMEX");						
							if (amex == true)
								this.value = formatAmexCCNumber(this.value); 	
								else
								this.value = formatCCNumber(this.value); 	
						}
					}
					if (oElement.getAttribute("TURKCELLNO")!=null) {
						oElement.onkeypress = function(){
						var sKey=String.fromCharCode(event.keyCode);
						if ((!digit.test(sKey))||(this.value.length==7)) 
							event.returnValue=false;
							this.restore();																			
						}
					}

				    if (oElement.getAttribute("DGTURKNO")!=null) {
						oElement.onkeypress = function(){
						var sKey=String.fromCharCode(event.keyCode);
						if ((!digit.test(sKey))||(this.value.length==10)) 
							event.returnValue=false;							
							this.restore();							
						}
					}
					
				    if (oElement.getAttribute("SHORTNAME")!=null) {
						oElement.onkeypress = function(){
						var sKey=String.fromCharCode(event.keyCode);
						if ((!shortname.test(sKey))||(!shortname2.test(sKey))|| (!shortname3.test(sKey))) 
							event.returnValue=false;							
						}
					}
					if (oElement.getAttribute("INTEGER")!=null && oElement.getAttribute("INTEGER")){
						oElement.onkeypress = function(){
						var sKey=String.fromCharCode(event.keyCode);
						if ((!digit.test(sKey)) || ((this.value=="") && (sKey=="0"))) {
							event.returnValue=false;
							return false;
							}							
						}
						oElement.onkeyup = function(){
							this.restore();												
						}
					}
					
					 if (oElement.getAttribute("NAMESURNAME")!=null) {
						
						oElement.onkeypress = function(){
						var sKey=String.fromCharCode(event.keyCode);
						if ((!reg_mixed.test(sKey)) || ((this.value=="") && (sKey=="0"))) {
							event.returnValue=false;	
							
							}
						}
					}
					if (oElement.getAttribute("ZEROINTEGER")!=null && oElement.getAttribute("ZEROINTEGER")){
						oElement.onkeypress = function(){
						var sKey=String.fromCharCode(event.keyCode);
						if (!digit.test(sKey)) {
							event.returnValue=false;
							return false;
							}							
						}
						oElement.onkeyup = function(){
							this.restore();												
						}
					}
					
					// Custom onchange validation
				/*	if(svalidateWhen=="onchange") {
						// Capture and replace onchange event handlers
						if(oElement.onchange)
							oElement.fChange=oElement.onchange;
						oElement.onchange=function (){
							this.restore();
							if(!this.valid()){
								_err.raise();
								event.returnValue=false;
							}
							if(this.fChange && this.fChange()==false){
								event.returnValue=false;
							}
						}
					} */
					/***********************************
					Method:   Input.paint
					Purpose:  Change style of element
					Inputs:   none
					Returns:  undefined
					***********************************/
					oElement.paint=function(){
						var sColor = "#FFFFC0";
						if (!sColor){
							// Paint element by changing class
							this.setAttribute("oldClass", this.className);
							this.className = "invalid";
						}else{
							// Paint element by changing color directly
							this.setAttribute("bg", this.style.backgroundColor);
							this.style.backgroundColor = sColor;
						}
					}
					/********************************************
					Method:   Input.restore
					Purpose:  Restore element to original style
					Inputs:   none
					Returns:  undefined
					********************************************/
					oElement.restore=function () {
						var sBG=this.getAttribute("bg");
						if (sBG!=null) {
							// Revert to previous background color
							this.style.backgroundColor = sBG;
							this.removeAttribute("bg");
						}else{
							var sOldClass=this.getAttribute("oldClass");
							if (sOldClass!=null){
								// Revert to previous class
								this.className=sOldClass;
								this.removeAttribute("oldClass");
							}
						}
					}
					/**********************************************
					Method:   Input.valid
					Purpose:  validate an element based on the
					          attributes provided in the HTML text
					Inputs:   none
					Returns:  boolean
					**********************************************/
					oElement.valid=function (){
						var sType=this.type;
						if(sType=="text" || sType=="textarea" || sType=="file"){
							// Trim leading and trailing spaces
							if(this.form.getAttribute("notrim")==null)
								this.value = this.value.trim();
							// Remove any Server Side Include text
							if(this.form.getAttribute("ssi")==null){
								while (this.value.search("<!-"+"-#") > -1)
									this.value = this.value.replace("<"+"!--#", "<"+"!--");
							}
						}
						// REQUIRED
						if(this.getAttribute("REQUIRED")!=null && this.getAttribute("REQUIRED") && !this.value){
							_err.add(this, _validation.REQUIRED, null);
					 		return false;
						}
						
						// FLOAT
						var sFloatDelimiter=this.getAttribute("float");
						var bSigned=this.getAttribute("signed")!=null;
						if (sFloatDelimiter!=null && this.value){
							// Assign default value to delimiter
							sFloatDelimiter=(sFloatDelimiter==",")?",":"\\.";
							var re=new RegExp("^("+((bSigned)?"[\\-\\+]?":"")+"(\\d*"+sFloatDelimiter+"?\\d+)|(\\d+"+sFloatDelimiter+"?\\d*))$");
							if (!re.test(this.value)){
								_err.add(this, _validation.FLOAT, null);
								return false;
							}
						}
						// AMOUNT
						var sAmtDelimiter = this.getAttribute("amount");
						if (sAmtDelimiter!=null && this.value){
							// Assign default value to delimiter
							sAmtDelimiter=(sAmtDelimiter==",")?",":"\\.";
							var re = new RegExp("^"+((bSigned)?"[\\-\\+]?":"")+"\\d+("+sAmtDelimiter+"\\d{2})?$");
							if(!re.test(this.value)){
								_err.add(this, _validation.AMOUNT, null);
								return false;
							}
						}
						// CCNUMBER
						var sAmtDelimiter = this.getAttribute("CCNUMBER");
						if (sAmtDelimiter!=null && this.value){
							// Assign default value to delimiter
							var re = new RegExp("^\\d{4}(-\\d{4})*$");
							var reamex = new RegExp("^\\d{4}-\\d{6}-\\d{5}$");
							var isAmex = (this.getAttribute("AMEX") == true);
							if (this.disabled == false)
							{
							   if((isAmex&&(!reamex.test(this.value))) || (!isAmex&&(!re.test(this.value))))  
						       {
							     _err.add(this, _validation.CCNUMBER, null);
							      return false;
							   }
							
							   if ((isAmex&&(this.value.length!=17))||(!isAmex&&(this.value.length!=19)))
						       {
							     _err.add(this, _validation.CCNUMBER, null);
							     return false;
					           }
							}
						}
						
						// TURKCELLNO
						var sAmtDelimiter = this.getAttribute("TURKCELLNO");
						if (sAmtDelimiter!=null && this.value){
					
							if (this.disabled == false)
							{
							   if (this.value.length!=7)
						       {
    						     _err.add(this, _validation.TURKCELLNO, null);
	    					     return false;
							   }
		                    }
							else
							{
							    return true;
							}
						}

						// DGTURKNO
						var sAmtDelimiter = this.getAttribute("DGTURKNO");
						if (sAmtDelimiter!=null && this.value){
					
							   if ( (this.value.length!=10) ||
							        (this.value.substring(0,4))!= ("1000") )
						       {
    						     _err.add(this, _validation.DGTURKNO, null);
	    					     return false;
							   }
							   
						       else
							   {
							    return true;
							   }
						}
					
						
						// SHORTNAME
						var sAmtDelimiter = this.getAttribute("SHORTNAME");
						if (sAmtDelimiter!=null && this.value){
							// Assign default value to delimiter
							var re1 = new RegExp("^[^']*$");
							var re2 = new RegExp("^[^\"]*$");
							var re3 = new RegExp("^[^\#]*$");
							
							if( (!re1.test(this.value)) || (!re2.test(this.value)) || (!re3.test(this.value)) ){
								_err.add(this, _validation.SHORTNAME, null);
								return false;
							}
						}
						
						// AMOUNTTRL
						var sAmtDelimiter = this.getAttribute("AMOUNTTRL");
						if (sAmtDelimiter!=null && this.value){
							// Assign default value to delimiter
							var re = new RegExp("^\\d{1,3}(.\\d{3})*((,\\d{1,2}){0,1})$");
							if(!re.test(this.value)){
								_err.add(this, _validation.AMOUNT, null);
								return false;
							}
						}
						// AMOUNTWP
						var sAmtDelimiter = this.getAttribute("AMOUNTWP");
						
						if (sAmtDelimiter!=null && this.value){
							// Assign default value to delimiter
							var re = new RegExp("^\\d{1,3}(.\\d{3})*((,\\d{1,2}){0,1})$");
							if(!re.test(this.value)){
								_err.add(this, _validation.AMOUNTWP, null);
								return false;
							}
						}
						// AMOUNTFX
						var sAmtDelimiter = this.getAttribute("AMOUNTFX");
						if (sAmtDelimiter!=null && this.value){
							// Assign default value to delimiter
							var re = new RegExp("^\\d{1,3}(.\\d{3})*(,\\d{0,2})?$");
							if(!re.test(this.value)){
								_err.add(this, _validation.AMOUNT, null);
								return false;
							}
						}
						// INTEGER
						if (this.getAttribute("INTEGER")!=null && this.value){
//							var re=new RegExp("^"+((bSigned)?"[\\-\\+]?":"")+"\\d+$");
							var re = new RegExp("^\\d\\d*$");
							if (!re.test(this.value)){
								_err.add(this, _validation.INTEGER, null);
								return false;
							}
						}
						
						 if (this.getAttribute("NAMESURNAME")!=null&& this.value) {
					    
						var re = new RegExp("[A-Za-zÇçĞğİıÖöŞşÜü]");

						if (!re.test(this.value)) {
						    
							_err.add(this, _validation.NAMESURNAME, null);
							return false;
							}
						}
					
						// ZEROINTEGER
						if (this.getAttribute("ZEROINTEGER")!=null && this.value){
//							var re=new RegExp("^"+((bSigned)?"[\\-\\+]?":"")+"\\d+$");
							var re = new RegExp("^\\d\\d*$");
							if (!re.test(this.value)){
								_err.add(this, _validation.INTEGER, null);
								return false;
							}
						}
						// DATE
						var sFormat=this.getAttribute("DATE");
						if (sFormat!=null && this.value) {
							// Set default DATE format
							var DATEday = this.value - 0;
							
							var DATEmonth = this.name;
							DATEmonth = DATEmonth.substring(0,DATEmonth.length-3) + "Month";
							DATEmonth = eval('document.forms[0].'+ DATEmonth + ".value");
							DATEmonth = DATEmonth - 0;
							
							if ((DATEday==31)&&((DATEmonth==4)||(DATEmonth==6)||(DATEmonth==9)||(DATEmonth==11)))
							{
								_err.add(this, _validation.DATE, null);
								return false;
							}
							if ((DATEday>28)&&(DATEmonth==2))
							{
								_err.add(this, _validation.DATE, null);
								return false;
							}							
						}
						// MASK
						var sMask=this.getAttribute("mask");
						if(sMask && this.value){
							var sPattern=sMask.replace(
								/(\$|\^|\*|\(|\)|\+|\.|\?|\\|\{|\}|\||\[|\])/g,"\\$1");
							sPattern=sPattern.replace(/9/g ,"\\d");
							sPattern=sPattern.replace(/x/ig,".");
							sPattern=sPattern.replace(/z/ig,"\\d?");
							sPattern=sPattern.replace(/a/ig,"[A-Za-z]");
							var re=new RegExp("^"+sPattern+"$");
							if(!re.test(this.value)){
								_err.add(this, _validation.MASK, sMask);
								return false;
							}
						}
						// REGEXP
						var sRegexp=this.getAttribute("REGEXP");
						if(sRegexp && this.value){
							var re=new RegExp(sRegexp);
							if(!re.test(this.value)){
								_err.add(this, _validation.MASK, sRegexp);
								return false;
							}
						}
						// AND
						var sAnd=this.getAttribute("and");
						if(sAnd && this.value){
							var aAnd = sAnd.split(/,/);
							var i, iFields=aAnd.length;
							// Require each element in the list if this element is valued
							for(i=0; i<iFields; i++){
								var oNewElement=this.form.elements[aAnd[i]];
								if(oNewElement && oNewElement.value.trim()==""){
									_err.add(oNewElement, _validation.REQUIRED, null);
									return false;
								}
							}
						}
						// OR
						var sOr=this.getAttribute("or");
						if(sOr && this.value==""){
							var aOr=sOr.split(/,/);
							var i, iFields=aOr.length;
							var oNewElement, bAccum=false;
							for(i=0; i<iFields; i++){
								oNewElement=this.form.elements[aOr[i]];
								if(oNewElement)
									bAccum |= !!oNewElement.value.trim();
							}
							if(!bAccum){
								_err.add(this, _validation.REQUIRED, null);
								return false;
							}
						}
						// Perform onvalidate event handler
						if(this.onvalidate && this.onvalidate()==false)
							return false;

						return true;
					}
					oElement.bProcessed=true;
				}
			}
		}
	}
	// Limit use of script to valid environments
	if("".replace && document.body && document.body.getAttribute){
		/*********************************************************************
		Method:   String.trim
		Purpose:  Removing leading and trailing spaces
		Inputs:   none
		Returns:  string
		*********************************************************************/
		String.prototype.trim=function (){
			return this.replace(/^\s+|\s+$/g,"");
		}
		/*********************************************************************
		Method:   String.reformat
		Purpose:  Translate the DATE format into the correct LANGuage
		Inputs:   sLANG - LANGuage of error message to display
		          iType - type of failed validation
		Returns:  string
		*********************************************************************/
		String.prototype.reformat=function (sLANG,iType){
			var sString=this.valueOf();
			if (iType==_validation.DATE && _validation.messages[sLANG]) {
				sString=sString.replace(/MM/,_validation.messages[sLANG].MM);
				sString=sString.replace(/DD/,_validation.messages[sLANG].DD);
				sString=sString.replace(/YYYY/,_validation.messages[sLANG].YYYY);
			}
			return sString;
		}
		// Form setup
		if(document.forms){
			// Process forms and elements
			this.setup();

			var i, iForms=document.forms.length;
			for(i=0; i<iForms; i++){
				var oForm=document.forms[i];
				if(oForm.getAttribute("mark")!=null)
					oForm.markREQUIRED();
			}
		}
	}
}
_validation=new Validation;
_err=new Err;
