/**
 * SpiderGourmet Get-A-Quote Interface
 */

FormValidator.prototype.isValidUrl = function(value, bIsRequired) {
  if( !this.isValidRequired(value, bIsRequired) )
    return false;	

  if( !bIsRequired && value.length == 0 ) return true;

  re = /[a-z0-9-]+(\.[a-z0-9-]+)+$/;
  results = value.match( re );
  
  if( !results ) {
    this.errors.push("is formatted invalidly.  please re-enter.");
	return false;
  };

  var qs = Object.toQueryString({ URL: value });
  var request_url = '/applications/getaquote/is-valid-url.php?'+qs;

  

  var response = null;
  var xhr = new XHR({
		method: 'get',
		async: false
  }).send('/applications/getaquote/is-valid-url.php', qs);

  resp = Json.evaluate(xhr.transport.responseText);

  if( !resp.isValidUrl ) {
    this.errors.push("is not a valid url - could not find domain");
	return false;
  };

  return true;
};

var GetAQuote = {
  init: function(formID) {
    this.frmGetAQuote = $(formID);
    this.addFormJSFlag();
	//this.frmGetAQuote.startHeight = this.frmGetAQuote.offsetHeight;
	this.frmGetAQuote.setStyles({opacity:0});
	this.frmGetAQuote.validator = new FormValidator();
	this.frmGetAQuote.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);
	document.fireEvent('frmgetaquote_initialized');
  },

  addFormJSFlag: function() {
    var jsFlag = new Element("input", {"type":"hidden", "name":"js_flag", "value":"true"} );
    jsFlag.injectTop( this.frmGetAQuote );
//    this.frmGetAQuote.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, '' ); }
	    }
	  });
	});
  },
  
  setElementLabels: function(formID) {
    var all_labels = $$("#"+formID + ' label');
	all_labels.each( function(flabel) {
	  target_el = $(flabel.getProperty('for'));
	  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 < GetAQuote.frmGetAQuote.elements.length; index++ )
	  {
	    GetAQuote.frmGetAQuote.validator.errors.empty();
	    boolIsValid = true;
	    field_element = GetAQuote.frmGetAQuote.elements[index];
	    if( field_element.rules )
		  field_element.rules.each( function(strRule) {
		    boolIsValid = GetAQuote.frmGetAQuote.validator.isValid(strRule, field_element.value, field_element.isRequired);
		  }, field_element );

		if( !boolIsValid )
		{
		  errMessage = field_element.label + " " + GetAQuote.frmGetAQuote.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) */
	$$(GetAQuote.frmGetAQuote.elements).each( function(el) {el.blur();} );

    if( !GetAQuote.isFormValid() ) { e.stop(); return false; }
	else
	{return true; //alert('Form Is VALID');
	  /* Submit Form via Ajax */
	}
  },

  showForm: function() {    
    GetAQuote.frmGetAQuote.effects({duration: 1000, transition: Fx.Transitions.Cubic.easeOut}).start({'opacity':[0,1]});//, 'height':[0, GetAQuote.frmGetAQuote.startHeight]});
  }
};

document.addEvent( 'frmgetaquote_initialized', GetAQuote.showForm );