/**
 * Validating scripts for trident forms
 * @author Vladimir Miroshnichenko
 *  
 */

        function Validator()
        {
				this.R          = new Array();  //required array
				this.total     = 0;            //total fields in required array
				this.submitted = 0;            //if = 1 then has been submitted
				this.requiredCheckBoxes = new Array();  //required check boxes array
				this.requiredCheckBoxesKAy = new Array();
				this.RCBErrorMsg =  "";  //required check boxes error message
				this.activateRCBChecking = false;  //required check boxes error message
				this.datesBetween = new Array();
				this.datesStart                = "";
				this.datesFinish               = "";
				this.datesParentStart     = "";
				this.datesParentFinish   = "";
				this.datesAlertFinish     = "";
				this.datesAlertStart      = "";
				this.activateDates        = false;
				this.confirmPara = new Object();

				//methods
				this.addRequired = addRequired;
				this.validate = validate;
				this.addCheckBox     = addCheckBox;
				this.addCheckBoxKAy     = addCheckBoxKAy;
				this.setRCBErrorMsg = setRCBErrorMsg;
				this.compareDates = compareDates;
				this.focusme = focusme;
				this.password_valid = password_valid;
				this.date_valid = date_valid;
				this.emailValid = emailValid;
				this.subst = subst;
				this.findMyPos = findMyPos;
				this.isInteger = isInteger;
				this.isURL = isURL;
				this.isDigit = isDigit;
				this.BigFields = BigFields;
				this.RangeFields = RangeFields;
				this.validateLogin = validateLogin;
         }

		/**
		 * Usage  addRequired(<object for validate>,<text for output if required>,<text for output if invalid>,<type>)
		 * where type = "" , "email" , "password" , "confirm" , "integer", "real", "hidden",
		 * "start" , "finish" , "percent" , "textarea" , "url".
		 */
		function addRequired(_ob,_requiredtext,_invalidtext,_type)
		{
			this.R[this.total]         = new Object();
			this.R[this.total].ob      = _ob;
			this.R[this.total].text    = _requiredtext;
			this.R[this.total].invalid = _invalidtext;
			this.R[this.total].tip     = _type;

			this.total++;
		}


		/**
		 * Add checkbox
		 */
		function addCheckBox(_obj)
		{
			for(var i=0; i<this.requiredCheckBoxes.length; i++)
			{
				if (this.requiredCheckBoxes[i].obj == _obj) return;
			}
			var len = this.requiredCheckBoxes.length;
			this.requiredCheckBoxes[len] = new Object();
			this.requiredCheckBoxes[len].obj = _obj;
		}
		/**
		 * Add checkbox KAy
		 */
		function addCheckBoxKAy(id,_requiredtext)
		{
			var len = this.requiredCheckBoxesKAy.length;
			this.requiredCheckBoxesKAy[len] = new Object();
			this.requiredCheckBoxesKAy[len].obj = document.getElementById(id);
			this.requiredCheckBoxesKAy[len].text = _requiredtext;
		}

		/**
		 * Set RCB Error Message
		 */
		function setRCBErrorMsg(_msg)
		{
			this.RCBErrorMsg = _msg;
			this.activateRCBChecking = true;
		}

		//test string on long words
		function test_area(src) {
			 var test_area = "^\\s*(\\S{1,25}\\s+)*\\S{0,25}$";
			 var regex = new RegExp(test_area);
			 return regex.test(src);
 	    }

        function wrapto(max,maxlen,ta)
        {
            text = "" + ta.value;
            var temp = "";
            var chcount = 0;
            var ch = "";
            if (maxlen>0&&text.length>maxlen) text=text.substring(0,maxlen);
            for (var i = 0; i < text.length; i++) // for each character ...
            {
                //ch = text.substring(i,i+1);
                ch = text.charAt(i);
                if (ch == '\n' || ch == ' ' || ch == '\t') // if character is a end of word
                {
                    temp += ch;
                    chcount = 0;
                }else
                {
                    if (chcount == max) // word has max chacters on this line
                    {
                        temp += ' '; // go to next line
                        temp += ch; // go to next line
                        chcount = 1; // reset chcount
                    }else  // Not a newline or max characters ...
                    {
                        temp += ch;
                        chcount++;
                    }
                }
            }
            if (maxlen>0&&temp.length>maxlen) temp=temp.substring(0,maxlen);
            ta.value = temp;
        }
        // check area length
        function checkAreaLen(maxLen,area)
        {
            str = area.value;
            len = str.length;
            if ( len > maxLen ) area.value = str.substring(0,maxLen);
            area.focus();
        }

        /**
        * Compare dates
        */
        function compareDates(date1,date2)
        {
            var month1 = parseInt(date1.substring(0,1))*10+parseInt(date1.substring(1,2));
            var day1 = parseInt(date1.substring(3,4))*10+parseInt(date1.substring(4,5));
            var year1 = parseInt(date1.substring(6,10));
            var month2 = parseInt(date2.substring(0,1))*10+parseInt(date2.substring(1,2));
            var day2 = parseInt(date2.substring(3,4))*10+parseInt(date2.substring(4,5));
            var year2 = parseInt(date2.substring(6,10));

            //			alert('month1: '+month1+"; day1: "+day1+"; year1: "+year1+". month2 : "+month2+"; day2 :"+day2+"; year2 : "+year2);

            if (year1 < year2) return -1;
            if (year1 > year2) return 1;
            if (month1 < month2) return -1;
            if (month1 > month2) return 1;
            if (day1 < day2) return -1;
            if (day1 > day2) return 1;
            return 0;
        }

		function strtrim()
		{
		  return this.replace(/^\s+/,'').replace(/\s+$/,'');
		}

		String.prototype.trim = strtrim;

		/**
		 * Main function for validate
		 */
		function validate()
		{
			  if(this.submitted == 1)
			  {
				   alert("This form has been submitted");
				   return false;
			  }

			  for (var i=0; i<this.R.length; i++)
			  {
			  	   //this.R[i].ob.value = this.R[i].ob.value.trim();  //delete whitespaces before and after value

				   if(this.R[i].tip=="")  // only check for existing
				   {
						if(this.R[i].ob.value.trim()=="")
						 {
							  alert(""+this.R[i].text);
							  focusme(this.R[i].ob);
							  return false;
						 }
				   }

				   if(this.R[i].tip=="email")
				   {
					   if(!emailValid(this.R[i])) return false;
				   }

				   if(this.R[i].tip=="password")
				   {
						  //search confirm field
						  this.confirmPara = null;
						  for (var j=0;j<this.R.length; j++)
						  {
								if(this.R[j].tip=="confirm")
								{
									  this.confirmPara = this.R[j];
									  break;
								}
						  }
						 if(!this.password_valid(this.R[i])) return false;
				   }

			      if(this.R[i].tip=="start")
				   {
				  	   	   if(!date_valid(this.R[i])) return false;
				   }
				   if(this.R[i].tip=="finish")
				   {
						    if(!date_valid(this.R[i])) return false;
				   }

				   if(this.R[i].tip=="integer")
				   {
							if(this.R[i].ob.value.trim()=="")
							 {
								   alert(""+this.R[i].text);
								   focusme(this.R[i].ob);
								   return false;
							 }
							if(!isInteger(this.R[i].ob.value))
							 {
								  alert(""+this.R[i].invalid);
								  focusme(this.R[i].ob);
								  return false;
							 }
			       }

				   if(this.R[i].tip=="real")
				   {
							if(this.R[i].ob.value.trim()=="")
							 {
								   alert(""+this.R[i].text);
								   focusme(this.R[i].ob);
								   return false;
							 }
							if(!isReal(this.R[i].ob.value))
							 {
								  alert(""+this.R[i].invalid);
								  focusme(this.R[i].ob);
								  return false;
							 }
			       }

				   if(this.R[i].tip=="hidden")
				   {
							if(this.R[i].ob.value.trim()=="")
							 {
								   alert(""+this.R[i].text);
								   return false;
							 }
			       }

				   if(this.R[i].tip=="select")
				   {
							if(this.R[i].ob.value.trim()=="")
							 {
								   alert(""+this.R[i].text);
								   return false;
							 }
			       }

				   if(this.R[i].tip=="textarea")
				   {
						if(this.R[i].ob.value.length>500)
						 {
							  alert(""+this.R[i].invalid);
							  focusme(this.R[i].ob);
							  return false;
						 }
		   			}

			if(this.R[i].tip=="login")
			{
				if(this.R[i].ob.value.trim()=="")
				{
					alert(""+this.R[i].text);
					focusme(this.R[i].ob);
					return false;
				}

				if(!validateLogin(this.R[i].ob.value))
				{
					alert(""+this.R[i].invalid);
					focusme(this.R[i].ob);
					return false;
				}
			}

		   if(this.R[i].tip=="url")
		   {
				 if(this.R[i].ob.value.trim()=="")
				 {
						   if(this.R[i].text!="")
						   {
								 alert(""+this.R[i].text);
								 focusme(this.R[i].ob);
								 return false;
						   }
				 }
				 if(!isURL(this.R[i].ob.value))
				 {
					  alert(""+this.R[i].invalid);
					  focusme(this.R[i].ob);
					  return false;
				 }
		   }

			   if(this.R[i].tip=="percent")
			   {
					if(this.R[i].ob.value.trim()=="")
					 {
						   alert(""+this.R[i].text);
						   focusme(this.R[i].ob);
						   return false;
					 }
					if(!isInteger(this.R[i].ob.value) || parseInt(this.R[i].ob.value) > 100)
					 {
						  alert(""+this.R[i].invalid);
						  focusme(this.R[i].ob);
						  return false;
					 }
			   }
		  }//for


		  for (var i=0; i<this.requiredCheckBoxesKAy.length; i++)
		  {
				if (!(this.requiredCheckBoxesKAy[i].obj.checked)){
				    this.requiredCheckBoxesKAy[i].obj.focus();
					alert(this.requiredCheckBoxesKAy[i].text);
					return false;	
				}	
	       }

		  var selectedRCBCount = 0;

		  for (var i=0; i<this.requiredCheckBoxes.length; i++)
		  {
				if (this.requiredCheckBoxes[i].obj.checked) selectedRCBCount++;
	       }

			if (this.activateRCBChecking)
			if (selectedRCBCount < 1)
			{
				alert(RCBErrorMsg);
				return false;
			}

			if (this.activateDates)
			{
				if (compareDates(this.datesStart.value,this.datesParentStart)==-1)
				{
					this.datesStart.focus();
					this.datesStart.select();
					alert(this.datesAlertStart);
					return false;
				}

				if (compareDates(this.datesFinish.value,this.datesParentFinish)==1)
				{
					this.datesFinish.focus();
					this.datesFinish.select();
					alert(this.datesAlertFinish);
					return false;
				}
			}

		  submitted = 1;
		  return true;
		}

		/**
		 *   Set focus on element
		 */
		function focusme(me)
		{
		   me.focus();
		   me.select();
		}

		/**
		 *   Check password field
		 */
		function password_valid(MyObj)
		{
		  var len = 5;
		  var S = MyObj.ob.value;
		  if(S=="")
		  {
				  alert(""+MyObj.text);
				  focusme(MyObj.ob);
				  return false;
		  }

		  if(S.length > len)
			{
			  if(this.confirmPara!=null)
			  {
				   if(this.confirmPara.ob.value==S){ return true; }
				   else
				   {
						alert(this.confirmPara.invalid);
						focusme(MyObj.ob);
						return false;
				   }
			  }
			  return true;
			}else
			{
				  alert(MyObj.invalid);
				  focusme(MyObj.ob);
				  return false;
			}
		}

		/**
		 *   Check date
		 */
		function date_valid(MyObj)
		{
		  var len = 5;
		  var S = MyObj.ob.value;
		  if(S=="")
			{
				  alert(""+MyObj.text);
				  focusme(MyObj.ob);
				  return false;
			}

		 if(MyObj.tip=='start')
		 {
		   var finishPara = new Object();
		   //search finish field
		   for (var i=0; i<R.length; i++)
		   {
			 if(this.R[i].tip=="finish")
			 {
			   finishPara = this.R[i];
			   break;
			 }
		   }
		   if(compareDates(finishPara.ob.value,S)>-1){ return true; }
			 else
			 {
					alert(finishPara.text);
					focusme(MyObj.ob);
					return false;
			 }
			 return true;
		 }
		 return true;
		}

		/**
		 *   Check email
		 */
/*
		function emailValid(MyObj)
		 {
			var S = MyObj.ob.value.trim();
			if(S=="")
			{
			  alert(""+MyObj.text);
			  focusme(MyObj.ob);
			  return false;
			}
			// 1. The symbol '@' is present, only one and not first
			if (S.indexOf("@")>0 && S.indexOf("@")==S.lastIndexOf("@") &&
			// 2. The text present between '@' and '.' symbols
			(S.lastIndexOf(".")-S.indexOf("@"))>1 &&
			// 3. After last point we have 2 or more characters
			(S.length - S.lastIndexOf("."))>2  && !(S.indexOf(" ")>0))
			{
				return true;
			}else
			{
			   alert(MyObj.invalid);
			   focusme(MyObj.ob);
			   return false;
			}
		}
*/
        function emailValid(MyObj)
        {
            var S = MyObj.ob.value.trim();
            if(S=="")
            {
            alert(""+MyObj.text);
            focusme(MyObj.ob);
            return false;
            }
            //var emailPat = /^(\".*\"|[A-Za-z]\w*)@(\[\d{1,3}(\.\d{1,3}){3}]|[A-Za-z]\w*(\.[A-Za-z]\w*)+)$/;
            var emailReg = "^[A-Za-z][A-Za-z0-9_\-]*\@(((([A-Za-z]+([\-]?[A-Za-z0-9])+|[A-Za-z])[\.])+[A-Za-z]{2,4})|((([01]?[0-9]{1,2})|(2(([0-4][0-9])|(5[0-5]))))[\.]){3}(([01]?[0-9]{1,2})|(2(([0-4][0-9])|(5[0-5])))))$";
            var regex = new RegExp(emailReg);
            if(regex.test(S))
            {
                return true;
            }else
			{
			   alert(MyObj.invalid);
			   focusme(MyObj.ob);
			   return false;
			}
        }

        function isNameValid(name)
        {
             var nameReg = "^[\\w_]+$";
             var regex = new RegExp(nameReg);
             return regex.test(name);
        }

		/**
		 *   Substring
		 */
		function subst(aString, c1, c2)
		{
			if (aString == "") return(aString);
			if (c1 == "") return(aString);
			var argc=subst.arguments.length;
			if (argc < 4) {n = 0} else {n = subst.arguments[3]};
			var i = aString.indexOf(c1, n);
			if (i < 0) return(aString);
			var s1 = aString.substring(0, i);
			var s2 = aString.substring(i+c1.length, aString.length);
			return subst(s1+c2+s2, c1, c2, (i+c2.length));
		}

		/**
		 *  Find element position
		 */
		 function findMyPos(me)
		  {
			  for (i = 0; i < me.form.length; i++)
			  if(me.form.elements[i].value == me.value && me.form.elements[i].name == me.name)
			  {return i;}
		  }

		/**
		 *  Check integer
		 */
		 function isInteger(val)
		 {
			if (val.length<1) return false;
			if(val.length>1 && val.charAt(0)=='0'){ return false; }
			for (var i=0; i < val.length; i++)
			{
			if (!isDigit(val.charAt(i))){ return false; }
			}
			return true;
		 }

		/**
		 *  Check real
		 */
		 function isReal(val)
		 {
			if (val.length<1) return false;
			var regularExpression = /^\d+[\.\,]?\d+$/;

			if(isInteger(val)){ return true; }
			else
			{
			  return regularExpression.test(val);
			}
		 }

		/**
		 *  Check URL
		 */
		 function isURL(val)
		 {
			if(val==""){ return true; }
			if(
			   val.indexOf('http://')!=-1 || val.indexOf('https://')!=-1 ||
			   val.indexOf('ftp://')!=-1  || val.indexOf('gopher://')!=-1 ||
			   val.indexOf('news:')!=-1   || val.indexOf('mailto:')!=-1
			  ){ return true; }
			return false;
		  }

		/**
		 *  Check Digit
		 */
		 function isDigit(num)
		 {
			var string="1234567890";
			if (string.indexOf(num) != -1)
			{
			return true;
			}
			return false;
		 }

		/**
		 *  Check Char
		 */
          function isAZChar(ch)
          {
                if((ch>='a' && ch <= 'z') || (ch>='A' && ch <='Z')){ return true; }
                else{ return false; }
          }

		/**
		 *  Check big fields
		 */
		function BigFields(textdata,obj1,obj2)
		{
			if (obj1.value>obj2.value)
			{
			alert(""+textdata);
			focusme(obj1);
			return false;
			};
			return true;
		}

		/**
		 *  Check range
		 */
		function RangeFields(textdata,obj1,range1,obj2,range2)
		{
			if ((obj1.value<range1) || (obj2.value>range2))
			{
			alert(""+textdata);
			return false;
			}else
			{
			  return true;
			}
		}

		/**
		 *  Check login
		 */
		function validateLogin(login)
		{
			var checkStr 	 = login
			var invalidChars = 0;
			for (i = 0;  i < checkStr.length;  i++)
			{
				if (checkStr.charAt(i) == ' ')
					invalidChars++;
				else if (checkStr.charAt(i) == ',')
					invalidChars++;
				else if (checkStr.charAt(i) == ':')
					invalidChars++;
				else if (checkStr.charAt(i) == ';')
					invalidChars++;
				else if (checkStr.charAt(i) == '/')
					invalidChars++;
				else if (checkStr.charAt(i) == '*')
					invalidChars++;
				else if (checkStr.charAt(i) == '?')
					invalidChars++;
				else if (checkStr.charAt(i) == '"')
					invalidChars++;
				else if (checkStr.charAt(i) == '>')
					invalidChars++;
				else if (checkStr.charAt(i) == '<')
					invalidChars++;
				else if (checkStr.charAt(i) == '|')
					invalidChars++;
				else if (checkStr.charAt(i) == '{')
					invalidChars++;
				else if (checkStr.charAt(i) == '}')
					invalidChars++;
				else if (checkStr.charAt(i) == '[')
					invalidChars++;
				else if (checkStr.charAt(i) == ']')
					invalidChars++;
				else if (checkStr.charAt(i) == '!')
					invalidChars++;
				else if (checkStr.charAt(i) == '#')
					invalidChars++;
				else if (checkStr.charAt(i) == '$')
					invalidChars++;
				else if (checkStr.charAt(i) == '%')
					invalidChars++;
				else if (checkStr.charAt(i) == '^')
					invalidChars++;
				else if (checkStr.charAt(i) == '&')
					invalidChars++;
				else if (checkStr.charAt(i) == '(')
					invalidChars++;
				else if (checkStr.charAt(i) == ')')
					invalidChars++;
				else if (checkStr.charAt(i) == '~')
					invalidChars++;
				else if (checkStr.charAt(i) == '`')
					invalidChars++;
				else if (checkStr.charAt(i) == '=')
					invalidChars++;
				else if (checkStr.charAt(i) == '+')
					invalidChars++;
				else if (checkStr.charAt(i) == '\'')
					invalidChars++;
			}

			if (invalidChars > 0) return false;
			return true;
		}


