﻿var FormValidate = Class.create();
FormValidate.prototype = {

  initialize: function (p)
  {
    this.params=p;
    for(i=0;i<p.length;i++)
    {
      var e=p[i];
      if (this.isRequired(e))
        $(e.label).addClassName('required');
    }
    this.erList = new Array();
    this.errClass = 'validateError';
  },



  checkSpecialCharacter: function(v,chkSpecial)
  {
    if (!chkSpecial) return false;
    var p=new RegExp("[^A-Za-z_ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿĀāĂăĄąĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥħĨĩĪīĬĭĮįİıĲĳĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňŉŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽž0-9.\\'\\.\\-]","g");
    /*var p=new RegExp("[^\\w\\d\\-\\.]");*/
    /*"\\[|\\]|%|\\^", "i");*/
    patmatch=p.test(v);
    return patmatch;
  },

  checkText:function(id,required,chkSpecial,minL,maxL)
  {
	  if(minL<0) minL=0;  
	  if(required&&minL<1) minL=1;  
  	
    var v = $F(id);  
    if(required)
    {
      if(v==null||v==undefined)
        return false;
      else 
      {
        if(v.length<minL)return false;
        if(v.length>maxL)return false;
        if(this.checkSpecialCharacter(v,chkSpecial))return false;
      } 
    }
    else 
    {
      if(v!=null&&v!=undefined&&v.length>0)
      {
        if(v.length>maxL)return false;
        if(this.checkSpecialCharacter(v,chkSpecial))return false;
      }
    }  
    return true;
  },

  checkNumber:function(id,required,onlyInt,minV,maxV)
  {
    var v=$F(id);  
    if (required||v.length>0)
    {
      if (v==undefined||v==null||isNaN(v)||v!=parseFloat(v))
        return false;
      else
      {
        if(onlyInt&&(parseInt(v)!=v||v.indexOf('.')!=-1)) return false;
        if (v<minV) return false;
        if (v>maxV) return false;
      }  
    }
    return true;
  },

  checkEmail: function(id,required)
  {
    var v = $F(id);  

	  var moreExt = new Array("info","aero","museum","name");
    if (required||v.length>0)
    {
	    var p = new RegExp("^(\\w|-|\\.)+@(\\w|-|\\.)+\\.[a-z]{2,3}$", "i");
	    pMatch=p.test(v);
   	  if(pMatch)
	  	  return true;
	    else	
	    {
		    for(var i=0;i<moreExt.length;i++)
			  {
			    p.compile("^(\\w|-|\\.)+@(\\w|-|\\.)+\\." + moreExt[i] +"$");
			    pMatch = p.test(v);
			    if(pMatch)
				    return true;
			  }
      }
  	  return false;
    }  
	  return true;	
  },

  checkDate: function(idD,idM,idY)
  {
	  var vD=$F(idD);
	  var vM=$F(idM);
	  var vY=$F(idY);
	  var v=vD+'/'+vM+'/'+vY;

	  var re= /(\d{1,2})(-|\/)+(\d{1,2})(-|\/)+(\d{4}|\d{2})/;

	  if(!re.test(v))
		  return false;



	  var res=null;
	  if( v.match(/\-/) != null )
		  res=v.split(/\-/);
	  else
		  res=v.split(/\//);
  	
	  if(res!=null)
	  {
		  if(res.length!=3) return false;
		  var d=new Date(vY,vM-1,vD);
		  if (d.getDate()!=vD||d.getMonth()!=vM-1||d.getFullYear()!=vY) return false;
      return true;
	  }

    return false;
  },

  checkCompare: function (e)
  {
    if (e.idCompare==null||e.idCompare==undefined) return true;
    if ($F(e.id) != $F(e.idCompare)) return false;
      return true;
  },

  checkOption: function (id)
  {
	  if($(id).selectedIndex > 0 ) return true;
	  return false;
  },

  isRequired: function (e)
  {
    if (e.required==null||e.required==undefined) return true;
    return e.required;  
  },

  min: function (e)
  {
    if (e.min==null||e.min==undefined) return Number.MIN_VALUE;
    return e.min;  
  },

  max: function (e)
  {
    if (e.max==null||e.max==undefined) return Number.MAX_VALUE;
    return e.max;  
  },

  setError: function (e)
  {
    var t=this;
    t.valid=false;
    t.erList.push(e.message);
    try {
    if(!$(e.label).hasClassName(t.errClass)) $(e.label).addClassName(t.errClass)
    if(e.type=='date'){
    if(!$(e.idD).hasClassName(t.errClass)) $(e.idD).addClassName(t.errClass)
    if(!$(e.idM).hasClassName(t.errClass)) $(e.idM).addClassName(t.errClass)
    if(!$(e.idY).hasClassName(t.errClass)) $(e.idY).addClassName(t.errClass)
    }else
    if(!$(e.id).hasClassName(t.errClass)) $(e.id).addClassName(t.errClass)
    }
    catch(e){};
  },


  setErrorCompare: function (e)
  {
    var t=this;
    t.valid=false;
    t.erList.push(e.messageCompare);
    try {
    if(!$(e.label).hasClassName(t.errClass)) $(e.label).addClassName(t.errClass)
    if(!$(e.id).hasClassName(t.errClass)) $(e.id).addClassName(t.errClass)
    if(!$(e.idCompare).hasClassName(t.errClass)) $(e.idCompare).addClassName(t.errClass)
    if(!$(e.labelCompare).hasClassName(t.errClass)) $(e.labelCompare).addClassName(t.errClass)
    }
    catch(e){};
  },

  cleanError: function (e)
  {
    var t=this;
    try
    {
    if($(e.label).hasClassName(t.errClass)) $(e.label).removeClassName(t.errClass)
    if(e.type=='date'){
    if($(e.idD).hasClassName(t.errClass)) $(e.idD).removeClassName(t.errClass)
    if($(e.idM).hasClassName(t.errClass)) $(e.idM).removeClassName(t.errClass)
    if($(e.idY).hasClassName(t.errClass)) $(e.idY).removeClassName(t.errClass)
    }else
    if($(e.id).hasClassName(t.errClass)) $(e.id).removeClassName(t.errClass)
    }
    catch(e){};
  },

  addErrorMessage: function (msg)
  {
    this.erList.push(msg);
  },

  setErrorClass: function (id)
  {
    if(!$(id).hasClassName(this.errClass)) $(id).addClassName(this.errClass)
  },

  resetErrorClass: function (id)
  {
    if($(id).hasClassName(this.errClass)) $(id).removeClassName(this.errClass)
  },

  setErrorState: function ()
  {
    this.valid=false;
  },

  getValidationStatus: function ()
  {
    return this.valid;
  },

  getValidationErrorList: function ()
  {
    var el=this.erList;
    if(el==null||el==undefined||el.length==0) return '';
    var t='<ul>';
    for (i=0;i<el.length;i++)
      t +='<li>'+el[i]+'</li>';
    t+='</ul>';  
    return t;
  },



  validate: function ()
  {
    var t=this;
    var p=t.params;
    t.valid=true;
    t.erList = new Array();
         
    for(i=0;i<p.length;i++)
    {
      var e=p[i];
      switch (e.type)
      {
        case 'text':
        {
          if (!t.checkText(e.id,t.isRequired(e),true,t.min(e),t.max(e))) t.setError(e)
          else if(!t.checkCompare(e)) t.setErrorCompare(e)
          else
            t.cleanError(e);
        }  
        break;

        case 'any-text':
        {
          if (!t.checkText(e.id,t.isRequired(e),false,t.min(e),t.max(e))) t.setError(e)
          else if(!t.checkCompare(e)) t.setErrorCompare(e)
          else
            t.cleanError(e);
        }  
        break;

        case 'int':
        {
          if (!t.checkNumber(e.id,t.isRequired(e),true,t.min(e),t.max(e))) t.setError(e)
          else if(!t.checkCompare(e)) t.setErrorCompare(e)
          else
            t.cleanError(e);
        }  
        break;
        case 'number':
        {
          if (!t.checkNumber(e.id,t.isRequired(e),false,t.min(e),t.max(e))) t.setError(e)
          else if(!t.checkCompare(e)) t.setErrorCompare(e)
          else
            t.cleanError(e);
        }  
        break;
        case 'date':
        {
          if (t.isRequired(e)&&(!t.checkDate(e.idD,e.idM,e.idY))) t.setError(e)
          else if(!t.checkCompare(e)) t.setErrorCompare(e)
          else
            t.cleanError(e);
        }  
        break;
        case 'email':
        {
          if (!t.checkEmail(e.id,t.isRequired(e))) t.setError(e)
          else if(!t.checkCompare(e)) t.setErrorCompare(e)
          else
            t.cleanError(e);
        }  
        break;
        case 'option':
        {
          if (t.isRequired(e)&&(!t.checkOption(e.id))) t.setError(e)
          else
            t.cleanError(e);
        }  
        break;
        case 'check':
        {
          if (!t.isRequired(e))
          {
            if ($F(e.id)==null) t.setError(e)
            else
              t.cleanError(e)  
          }
          else
            t.cleanError(e);
        }  
        break;
      }
    }
    
    return t.valid;
  }


}
