var _FormErrors=[];
var _FormErrorFields=[];
var _FormBadColor='#ffdddd';
var _FormGoodColor='#ffffff';

var FormVerifyHandlers={}
var FormKeyHandlers={}
var FormSingleSubmit=false;
function check_element_flags(e)
{
  className=e.className;
  classes=className.split(" ");
  return classes;
}


FormVerifyHandlers.handleRequired=function (e)
{
  if ((e.value=="" || (e.type=="checkbox" && !e.checked)) && e.className.indexOf("_noRequire")==-1)
  {
    _FormErrors.push(FormLang['MISSING']);
    _FormErrorFields.push(e);
    return false;
  }
  else
  {
    return true;
  }
}

FormVerifyHandlers.handleVerify=function (e)
{
  if(ver=document.getElementById(e.id+"_verify"))
  {
    if (ver.value==e.value) return true;
  }
  _FormErrors.push(FormLang['NOMATCH']);
  _FormErrorFields.push(e);
  return false;
}

FormVerifyHandlers.handleCcnum=function (e)
{
  if(ver=document.getElementById("cctype"))
  {
    if (verify_ccnum(ver.value,e.value) || e.value=='') return true;
  }
  _FormErrors.push(FormLang['BAD_CREDIT']);
  _FormErrorFields.push(e);
  return false;
}

FormVerifyHandlers.handleIdnum=function (e)
{
  if (!verify_idnum(e.value) && (e.value!=''))
  {
    _FormErrors.push(FormLang['BAD_IDNUM']);
    _FormErrorFields.push(e);
    return false;
  }
  else
  {
    return true;
  }
}


FormVerifyHandlers.handleEmail=function (e)
{
  if (!verify_email(e.value) && e.value!='')
  {
    _FormErrors.push(FormLang['BAD_EMAIL']);
    _FormErrorFields.push(e);
    return false;
  }
  else
  {
    return true;
  }
}

FormKeyHandlers.handlePhone=function (e)
{
  check_phone(e);
}

FormKeyHandlers.handleHebrew=function (e)
{
  check_hebrew(e);
}

FormKeyHandlers.handleEnglish=function (e)
{
  val=e.value;
  loop_depressor=500 // Prevent endless loops
  while( 
      (
        (!val.match(/^([a-zA-Z ]+)$/) && e.value!="") 
        ||
        (e.value!=val.toString())
      )
      &&
      ( --loop_depressor>0 )
    )
  {
    e.value=e.value.substr(0,e.value.length-1)
    val=e.value;
  }
}

FormKeyHandlers.handleEmail=function (e)
{
  val=e.value;
  loop_depressor=500 // Prevent endless loops
  while( 
      (
        (!val.match(/^([.a-zA-Z@_0-9\-]+)$/) && e.value!="") 
        ||
        (e.value!=val.toString())
      )
      &&
      ( --loop_depressor>0 )
    )
  {
    e.value=e.value.substr(0,e.value.length-1)
    val=e.value;
  }
}

FormKeyHandlers.handleName=function (e)
{
  val=e.value;
  loop_depressor=500 // Prevent endless loops
  while( 
      (
        (!val.match(/^(["'\u0590-\u05FF a-zA-Z]+)$/) && e.value!="") 
        ||
        (e.value!=val.toString())
      )
      &&
      ( --loop_depressor>0 )
    )
  {
    e.value=e.value.substr(0,e.value.length-1)
    val=e.value;
  }
}

FormKeyHandlers.handleTextarea=function (e)
{
  val=e.value;
  loop_depressor=500 // Prevent endless loops
  var maxlength=parseInt(e.getAttribute("maxlength"));
  var length=e.value.length;
  if (!isNaN(maxlength) && length > maxlength)
  {
    e.value=e.value.substr(0,maxlength)
  
  
  }
}


FormVerifyHandlers.handleText=function (e)
{
  var maxlength=parseInt(e.getAttribute("maxlength"));
  // Extension over the web forms 2 extension;-)
  var minlength=parseInt(e.getAttribute("minlength"));
  var length=e.value.length;
  if (!isNaN(minlength))
  {
    if (length < minlength)
    {
      _FormErrors.push(FormLang['TOO_SHORT']+ minlength);
      _FormErrorFields.push(e);
      return false;
    }
  }
  if (!isNaN(maxlength))
  {
    if (length > maxlength)
    {
      _FormErrors.push(FormLang['TOO_LONG']+ maxlength);
      _FormErrorFields.push(e);
      return false;
    }
  }
  return true;
}

FormVerifyHandlers.handleNumber=function (e)
{
  min=parseInt(e.getAttribute("min"));
  max=parseInt(e.getAttribute("max"));
  if (!isNaN(min) || !isNaN(max))
  {
    num=parseInt(e.value);
    num=isNaN(num) ? 0 : num;
    if ((isNaN(min) ? false : num<min) || (isNaN(max) ? false : num>max))
    {
      _FormErrors.push(FormLang['OUT_OF_RANGE']+" "+(isNaN(min) ? "" : min)+" - "+(isNaN(max) ? "" : max));
      _FormErrorFields.push(e);
      return false;
    }
  }
  return true;
}

FormKeyHandlers.handleNumber=function (e)
{ 
  force_intval(e);
}

FormKeyHandlers.handleCcnum=function (e)
{ 
  force_ccnum(e);
}

FormKeyHandlers.handleCode=function (e)
{
  check_code(e);
}

function _check_key(e)
{
  field=getEventSrc(e)
  for(k=0;k<field._eflags.length;++k)
  {
    flag=field._eflags[k];
    switch(flag)
    {
      case '_phone':
        FormKeyHandlers.handlePhone(field)
	break;
      case '_number':
        FormKeyHandlers.handleNumber(field)
	break;
      case '_ccnum':
        FormKeyHandlers.handleCcnum(field)
	break;
      case '_hebrew':
        FormKeyHandlers.handleHebrew(field)
	break;
      case '_email':
        FormKeyHandlers.handleEmail(field)
	break;
      case '_english':
        FormKeyHandlers.handleEnglish(field)
	break;
      case '_name':
        FormKeyHandlers.handleName(field)
	break;
      case '_code':
        FormKeyHandlers.handleCode(field)
	break;
    }
  }
  // Web forms 2.0 spec
  switch(field.getAttribute("type"))
  {
    case 'number':
        FormKeyHandlers.handleNumber(field)
	break;
  }
  if (field.tagName.toLowerCase()=="textarea")
  {
    FormKeyHandlers.handleTextarea(field)
  }
  return true;
}

function _check_field()
{
  for(k=0;k<this._eflags.length;++k)
  {
    result=true;
    flag=this._eflags[k];
    switch(flag)
    {
      case '_required':
        result=FormVerifyHandlers.handleRequired(this)
	break;
      case '_email':
        result=FormVerifyHandlers.handleEmail(this)
	break;    
      case '_idnum':
        result=FormVerifyHandlers.handleIdnum(this)
	break;
      case '_verify':
        result=FormVerifyHandlers.handleVerify(this)
	break;    
      case '_ccnum':
        result=FormVerifyHandlers.handleCcnum(this)
	break;    
    }
    // Web forms 2.0 spec
    if (this.getAttribute('required')=='required')
      result=FormVerifyHandlers.handleRequired(this);
    // Web forms 2.0 spec
    switch(field.getAttribute("type"))
    {
      case 'number':
        FormVerifyHandlers.handleNumber(field)
	break;
      case 'text':
        FormVerifyHandlers.handleText(field)
	break;
      case 'password':
        FormVerifyHandlers.handleText(field)
	break;
    }
    if (this.tagName.toLowerCase()=="textarea")
        FormVerifyHandlers.handleText(field);
    if (!result) return false;
  }
  return true;
}

function _validate(e)
{
  var form=this
  var hasErrors=false;
  _FormErrors=[]
  _FormErrorFields=[]
  _OrRequired=[]
  _OrRequiredFound=0
  for(i=0;i<form.fields.length;++i)
  {
    field=form.fields[i];
    if (field.formError)
    {
      field.parentNode.removeChild(field.formError);
      field.formError=null;
    }    
    if(field.fieldset.style.display!='none')
      field.checkField();
    if(field.className.indexOf("_orRequired")>=0)
    {
      if((field.type!="checkbox" && field.value!="") || (field.type=="checkbox" && field.checked))
      {
        _OrRequiredFound+=1;      
      }
      else
      {
        _OrRequired.push(field);
      }    
    }
  }
  if (_OrRequiredFound==0)
  {
    for(i=0;i<_OrRequired.length;++i)  
    {
     _FormErrors.push(FormLang['OR_REQUIRED']);                                
     _FormErrorFields.push(_OrRequired[i]);
    }
  }
  if (_FormErrors.length>0)
  {
      hasErrors=true;
      alert(FormLang['INVALID_FIELDS']);
      if (e)
        stopEvent(e);
  }
  else
  {
    if(FormSingleSubmit)
    {
      var inputs=form.getElementsByTagName("input");
      for(var i=0;i<inputs.length;++i)
      {
        var input = inputs.item(i);
	if(input.type=="submit" || input.type=="image")
	{
	  input.disabled=true;
	}
      }
    }
  }
  while(field=_FormErrorFields.pop())
  {
    error=_FormErrors.pop();
    errorElement=document.createElement("div");
    errorElement.className="formError";
    errorText=document.createTextNode(error);
    errorElement.appendChild(errorText);
    if (field.formError)
    {
    }
    else
    {
      errorElement.className="fieldError";
      field.formError=errorElement;
      field.parentNode.appendChild(errorElement);
    }
  }
  try
  {  
    if (Layout)
      Layout.compute();
  }
  catch(e)
  {
  
  }
  return  !hasErrors;
}

function replaceIntoRange(e)
{
  var min=parseInt(e.getAttribute("min"));
  var max=parseInt(e.getAttribute("max"));
  var sel=document.createElement("select");
  if(e.value=="")
  {
    var opt=document.createElement("option");
    opt.value="";
    opt.appendChild(document.createTextNode("בחר"));
    sel.appendChild(opt);
  }
  
  for(var i=min;i<=max;++i)
  {
    opt=document.createElement("option");
    opt.value=i;
    if (e.value==opt.value)
      opt.selected=true;
    opt.appendChild(document.createTextNode(i));
    sel.appendChild(opt);
  }
  sel.name=e.name;
  sel.id=e.id;
  sel.onchange=e.onchange
  e.parentNode.replaceChild(sel,e);
  return sel;
}
  

function initForms()
{
  forms=document.forms;
  for(i=0;i<forms.length;++i)
  {
    form=forms.item(i);
    form.validate=_validate;
    form.fields=[];
    if (!form.onsubmit) form.onsubmit=form.validate;
    flags=check_element_flags(form);
    sets=form.getElementsByTagName('fieldset');
    for (k=0;k<sets.length;++k)
    {
      set=sets.item(k);
      set_flags=flags.concat(check_element_flags(set));
      var inputs=set.getElementsByTagName('input');
      var selects=set.getElementsByTagName('select');
      var tas=set.getElementsByTagName('textarea');
      var helps=set.getElementsByTagName('help');
      for(l=0;l<inputs.length;++l)
      {
          e=inputs.item(l);
	  e.fieldset=set;
	  if (e.getAttribute("type")=="range")
	  {
	    e=replaceIntoRange(e);
	    --l;
	  }
      	  eflags=set_flags.concat(check_element_flags(e));
	  e.checkField=_check_field
	  e.checkKey=_check_key
	  e._eflags=eflags
	  form.fields.push(e);
	  addEvent(e,"keyup",e.checkKey)
      }
      for(l=0;l<selects.length;++l)
      {
          e=selects.item(l);
	  e.fieldset=set;
      	  eflags=set_flags.concat(check_element_flags(e));
	  e.checkField=_check_field
	  e._eflags=eflags
	  form.fields.push(e);
      }
      for(l=0;l<tas.length;++l)
      {
          e=tas.item(l);
	  e.fieldset=set;
      	  eflags=set_flags.concat(check_element_flags(e));
	  e.checkField=_check_field
	  e.checkKey=_check_key
	  e._eflags=eflags
	  form.fields.push(e);
	  addEvent(e,"keyup",e.checkKey)
      }
      var helps_length=helps.length
      for(l=0;l<helps_length;++l)
      {
        var help=helps.item(l);
	if (help.childNodes.length==0)
	{
	  // Needed for poor IE users. it's a bit of a wild guess but works...
	  var nhelp=document.createElement("help");
	  var tinputs=help.parentNode.getElementsByTagName("input");
	  var tselects=help.parentNode.getElementsByTagName("select");
	  if (tinputs.length>0)
  	    nhelp.setAttribute("for",tinputs.item(0).name)
	  else if (tselects.length>0)
  	    nhelp.setAttribute("for",tselects.item(0).name)	    
	  help.parentNode.replaceChild(nhelp,help);
	  help=nhelp;
	  var text=help.nextSibling;
	  while(text)
	  {
	    var ntext=text.nextSibling;
	    text.parentNode.removeChild(text);
   	    help.appendChild(text);
	    text=ntext;	    
	  }
        }	
	var target=help.getAttribute("for");
	var target_el=form.elements[target]
	if (!target)
	{
	  var tinputs=help.parentNode.getElementsByTagName("input");
	  var tselects=help.parentNode.getElementsByTagName("select");
	  if (tinputs.length>0)
	  {
  	    target=tinputs.item(0).name;
	    target_el=tinputs.item(0);
	  }
	  else if (tselects.length>0)
	  {
  	    target=tselects.item(0).name;
	    target_el=tselects.item(0);
	  }
	}
	target_el.help=help
	target_el.onfocus = function()
	{	 
	  if (this.offsetLeft-250>0)
	    this.help.style.left=(this.offsetLeft-250)+"px";
	  else
	    this.help.style.left=(this.offsetLeft+this.offsetWidth+60)+"px";
	  this.help.style.top="0";
	  this.help.className="visible";
	  this.help._focus=1;
	}
	target_el.onmouseover = function()
	{	 
	  if (this.offsetLeft-250>0)
	    this.help.style.left=(this.offsetLeft-250)+"px";
	  else
	    this.help.style.left=(this.offsetLeft+this.offsetWidth+60)+"px";
	  this.help.style.top="0";
	  this.help.className="visible";
	  this.help._mouseover=1;
	}
	target_el.onblur = function()
	{
	  this.help._focus=0;
	  if (!this.help._mouseover)
	    this.help.className="";
	}
	target_el.onmouseout = function()
	{
	  this.help._mouseover=0;
	  if (!this.help._focus)
	    this.help.className="";
	}
      }
    }
  }
}
initForms()        
    

