var WebFormValidator = {
  init: function(formID) {
    this.WebForm = $(formID);
	this.WebForm.validator = new FormValidator();

	this.WebForm.onsubmit = '';
	this.WebForm.addEvent( 'submit', this.processForm );

    this.setElementEffects(formID);
	this.setElementLabels(formID);
	this.setCaptchaElements(formID);
	this.setRequiredElements(formID);
	this.setStringElements(formID);
	this.setProvinceStateElements(formID);
	this.setPhoneElements(formID);
	this.setEmailElements(formID);
	this.setUrlElements(formID);
  },

  addFormJSFlag: function() {
    var jsFlag = new Element("input", {"type":"hidden", "name":"js_flag", "value":"true"} );
    jsFlag.injectTop( this.WebForm );
//    this.WebForm.adopt(jsFlag);
  },
  
  setElementEffects: function(formID) {
    var id_selector = "#"+formID+" ";
    var selectors = ['input[type=text]', 'select', 'textarea'];
	var css_selector = id_selector + selectors.join(", "+id_selector)
    var elements = $$(css_selector);
	elements.each( function(felement) {
	  felement.fx = new Fx.Styles($(felement), {duration: 150, transition: Fx.Transitions.linear} );
	  felement.addEvents({
	    'focus': function() {
	      this.fx.start({ 'background-color': ['#ffffff', '#ddffdd'] });
	    },
		'blur': function() {
		  this.setStyle('background-color','#ffffff');
	    },
		'keyup': function() {
          if( this.hasClass('URL') ) { this.value = this.value.replace(/^(http:\/\/)/i, '' ); }

          /* Format the 'DaytimePhoneTextBox' value to reflect the form of xxx-xxx-xxxx */
          if( this.id == 'DaytimePhoneTextBox' )
          {
            val = this.value;
            val = val.replace(/[^\d]/g, '');
            len = val.length;
            new_value = '';
            for( i=0; i < len; i++ )
            {
              new_value += val.substr(i,1);
              if( i % 3 == 2 && i < 7 ) new_value += '-';
            };
            this.value = new_value;
          };
	    }
	  });
	});
  },
  
  setElementLabels: function(formID) {
    var all_labels = $$("#"+formID + ' label');
	all_labels.each( function(flabel) {
	  target_el = $(flabel.getProperty('for'));
      if( target_el ) target_el.label = flabel.getText();
	});
  },
  
  setCaptchaElements: function(formID) {
   var elements = $$("#"+formID + ' .CAPTCHA');
   elements.each( function(element) {	 
     element.isRequired = true;
	 if( !element.rules ) element.rules = [];
     element.rules[element.rules.length] = 'captcha';
   });
  },
  
  setRequiredElements: function(formID) {
   var elements = $$("#"+formID + ' .REQUIRED');
   elements.each( function(element) {
     element.isRequired = true;
	 
   });
  },
  
  setStringElements: function(formID) {
   var elements = $$("#"+formID + ' .STRING');
   elements.each( function(element) {
     if( !element.rules ) element.rules = [];
     element.rules[element.rules.length] = 'string';
   });
  },
  
  setPhoneElements: function(formID) {
   var elements = $$("#"+formID + ' .PHONE');
   elements.each( function(element) {
     if( !element.rules ) element.rules = [];
     element.rules[element.rules.length] = 'phone';
   });
  },
  
  setEmailElements: function(formID) {
   var elements = $$("#"+formID + ' .EMAIL');
   elements.each( function(element) {
     if( !element.rules ) element.rules = [];
     element.rules[element.rules.length] = 'email';
   });
  },
  
  setUrlElements: function(formID) {
   var elements = $$("#"+formID + ' .URL');
   elements.each( function(element) {
     if( !element.rules ) element.rules = [];
     element.rules[element.rules.length] = 'url';
   });
  },
  
  setProvinceStateElements: function(formID) {
   var elements = $$("#"+formID + ' .STATEPROVINCE');
   elements.each( function(element) {
     if( !element.rules ) element.rules = [];
     element.rules[element.rules.length] = 'stateprovince';
   });
  },
  
  isFormValid: function() {
    try {
	  for( index = 0; index < WebFormValidator.WebForm.elements.length; index++ )
	  {
	    WebFormValidator.WebForm.validator.errors.empty();
	    boolIsValid = true;
	    field_element = WebFormValidator.WebForm.elements[index];
        // Use the Field's Name as its Label Value in the Event it Has no Label Value at this Point
        if( !field_element.label ) field_element.label = field_element.name;

        if( field_element.nodeName.toLowerCase() == "select" && field_element.name.indexOf("State") > -1  )
        {
          if( field_element.selectedIndex == 0 )
          {
            errMessage = 'You Must Choose a Value other than "' + field_element.value + '" for ' + field_element.label.replace(/(^([\*\:\s]+)|([\*\:\s]+)$)/g,"");
		    throw( {field: field_element, type:'Field Error', message:errMessage.upperCaseWords()} );
          }
        }

	    if( field_element.rules )
		  field_element.rules.each( function(strRule) {
		    boolIsValid = WebFormValidator.WebForm.validator.isValid(strRule, field_element.value, field_element.isRequired);
		  }, field_element );

		if( !boolIsValid )
		{
		  errMessage = field_element.label.replace(/(^([\*\:\s]+)|([\*\:\s]+)$)/g,"") + " " + WebFormValidator.WebForm.validator.parseErrors();
		  throw( {field: field_element, type:'Field Error', message:errMessage.upperCaseWords()} );
		}
	  }
	
	  return true;
	} catch(e) {
	  /* Check if Error is a Validation Error. Prompt of Errors in that case. */
	  if( e.type && e.type == 'Field Error' )
	  {
	    alert(e.message);
		e.field.setProperty("title", e.message);
		e.field.setStyle("border-color", "red");
	    e.field.focus();
	  }
	  
	  return false;
	}
    
  },
  
  processForm: function(e) {
    var e = new Event(e);

	/* Explicitly blur() Form Elements to ensure they revert back to inert style(s) */
	$$(WebFormValidator.WebForm.elements).each( function(el) {el.blur();} );

    if( !WebFormValidator.isFormValid() ) { e.stop(); return false; }
	else
	{return true; //alert('Form Is VALID');
	  /* Submit Form via Ajax */
	}
  }
};