 	 /**************************************************************

	Script		: Validate
	Version		: 2.1
	Authors		: Samuel Birch
	Desc		: Form validation
	Licence		: Open Source MIT Licence

**************************************************************/

var Validate = new Class({
	
	getOptions: function(){
		return {
			validateOnBlur: true,
			errorClass: 'error',
			errorMsgClass: 'errorMessage',
			dateFormat: 'dd/MM/yy',
			onFail: Class.empty,
			onSuccess: false,
			showErrorsInline: true,
			label: 'Please wait...'
		};
	},

	initialize: function(form, options){
		this.setOptions(this.getOptions(), options);
		
		this.form = $(form);
		this.elements = this.form.getElements('.required');
		
		this.list = [];
		
		this.elements.each(function(el,i){
			if(this.options.validateOnBlur){
				el.addEvent('blur', this.validate.bind(this, el));
			}
		}.bind(this));
		
		this.form.addEvent('submit', function(e){
			var event = new Event(e);
			var doSubmit = true;
			this.elements.each(function(el,i){
				if(! this.validate(el)){
					event.stop();
					doSubmit = false
					this.list.include(el);
				}else{
					this.list.remove(el);
				}
			}.bind(this));
			
			if(doSubmit){
				if(this.options.onSuccess){
					event.stop();
					this.options.onSuccess(this.form);
				}else{
					this.form.getElement('input[type=submit]').setProperty('value',this.options.label);
				}
			}else{
				this.options.onFail(this.getList());
			}
			
		}.bind(this));
		
	},
	
	getList: function(){
		var list = new Element('ul');
		this.list.each(function(el,i){
			if(el.title != ''){
			var li = new Element('li').injectInside(list);
			new Element('label').setProperty('for', el.id).setText(el.title).injectInside(li);
			}
		});
		return list;
	},
	
	validate: function(el){
		var valid = true;
		this.clearMsg(el);
		
		switch(el.type){
			case 'text':
			case 'textarea':
			case 'select-one':
				if(el.value != ''){
					if(el.hasClass('email')){
						var regEmail = /^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/;
						if(el.value.toUpperCase().match(regEmail)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Please enter a valid email address');
						}
					}
					
					if(el.hasClass('number')){
						var regNum = /[-+]?[0-9]*\.?[0-9]+/;
						if(el.value.match(regNum)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Please enter a valid number');
						}
					}
					
					if(el.hasClass('postcode')){
						var regPC = /^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$/
						if(el.value.match(regPC)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Please enter a valid postcode');
						}
					}
					
					if(el.hasClass('date')){
						var d = Date.parseExact(el.value, this.options.dateFormat);
						if(d != null){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Please enter a valid date in the format: '+this.options.dateFormat.toLowerCase());
						}
					}
					
				}else{
					valid = false;
					this.setMsg(el);
				}
				break;
				
			case 'checkbox':
				if(!el.checked){
					valid = false;
					this.setMsg(el);
				}else{
					valid = true;
				}
				break;
				
			case 'radio':
				var rad = $A(this.form[el.name]);
				var ok = false;
				rad.each(function(e,i){
					if(e.checked){
						ok = true;
					}
				});
				if(!ok){
					valid = false;
					this.setMsg(rad.getLast(), 'Please select an option');
				}else{
					valid = true;
					this.clearMsg(rad.getLast());
				}
				break;
				
		}
		return valid;
	},
	
	setMsg: function(el, msg){
		if(msg == undefined){
			msg = el.title;
		}
		if(this.options.showErrorsInline){
			if(el.error == undefined){
				el.error = new Element('span').addClass(this.options.errorMsgClass).setText(msg).injectAfter(el);
			}else{
				el.error.setText(msg);
			}
			el.addClass(this.options.errorClass);
		}
	},
	
	clearMsg: function(el){
		el.removeClass(this.options.errorClass);
		if(el.error != undefined){
			el.error.remove();
			el.error = undefined;
		}
	}
	
});

Validate.implement(new Options);
Validate.implement(new Events);

 
   window.addEvent('load', function() {
		   buildJSClicks("area.map_links","ajaxCounty");        //MAP CLICKS
			 buildJSClicks("a.counties_class","ajaxCounty"); //COUNTIES CLICKS
       LoadEffects();
   });
	 	 
   
   function LoadEffects () {
      buildJSClicks("input.inputClass", "buildAdd");
      buildJSClicks("a.statemap", "show_map");
			buildJSTips("area.map_links");           //MAP TIPS
      buildJSTips('img.help');
      buildJSTips('img.links');
      buildJSTips('img.county_links');
      buildJSTips('img.county_help');      
      Shadowbox.setup();
      Shadowbox.init();
   }
  		  
	 function show_error() {
			$('uoobuild_error').setStyles({display: 'block'});
   }

	 function hide_error() {
			$('uoobuild_error').setStyles({display: 'none'});
   }

   function validate_sobi2() {
      var myFormValidation = new Validate('sobi2EditForm',{
          errorClass: 'red'
      });
   }

	 function show_map() {
			$('map').setStyles({display: 'block'});
			$('show_map').empty();
			$('show_map').setHTML("<a class='statemap' href='http://yoobuild.com/index.php?map=-1'> Hide Contractor Map  </a>");
      buildJSClicks("a.statemap", "hide_map");        //SHOW MAP CLICK
   }
   
	 function hide_map() {
			$('map').setStyles({display: 'none'});
			$('show_map').empty();
			$('show_map').setHTML("<a class='statemap' href='http://yoobuild.com/index.php?map=1'> Show Contractor Map  </a>");
			buildJSClicks("a.statemap", "show_map");        //SHOW MAP CLICK
   }
	 
	 function show_counties() {
			$('counties').setStyles({display: 'block'});
   }

	 function hide_counties() {
			$('counties').setStyles({display: 'none'});
   }	 
   

	 function ajaxCounty(county){
       var county_data = new Ajax('/uoobuild/county.php', { 
			    postBody: {'county': county}, 
			    method: 'post', 
					update: $('county_info'), 
			    onRequest: function(){
        		   $('county_info').setHTML("<br /><br /><img src='http://misc.images.yoobuild.com/loadingAnimation.gif' alt='Loading Data' /> Loading  County Data ... <br /><br />");
          },
					onComplete: function(){											
				      ajaxSideAds(county);
              buildJSTips('img.help');
              buildJSTips('img.links');
              buildJSTips('img.county_links');
              buildJSTips('img.county_help'); 
              Shadowbox.setup();
              Shadowbox.init();
      				if(element.search("contractor") != -1){
                  var myFormValidation = new Validate('countyForm',{
	                   errorClass: 'red'
	                });
			        }
			 	  }
       }).request();
	 }
	 
  function ajaxAdvertise(el) {			 
			 var counties_data  = new Ajax('/uoobuild/ads_licensee.php', {           
           postBody: el.value,			 
					 method: 'get',
					 update: $('contractor_advertising'),
					 onComplete: function() {
              buildJSTips('img[class="tradeshelp"]'); 
						  buildJSClicks("input.inputClass", "buildAdd");
							if (typeof el != 'undefined') {									
									if(!el.checked) {
    									if (el.name) {									
                          var myBox = new Fx.Styles(el.name, {duration: 900});
    											myBox.start({
                                'background-color': ['f7a9a9','ffffff']
                          });
                      }
									}																					    
							}
					}
			 }).request();
   }
   	 
	 function ajaxSideAds(county) {
       var trades_data = new Ajax('/uoobuild/ads.php', { 
			         postBody: {'county': county}, 
							 method: 'post', 
							 update: $('site_ads'), 
							 onComplete: function() {
							 }
			 }).request();			 
	 }
	 
	 function ajaxPreviewAd(el) {
       var trades_data = new Ajax('/uoobuild/preview_ad.php', { 
			         postBody: el.name, 
							 method: 'post', 
							 update: $('preview'), 
							 onComplete: function() {
							 }
			 }).request();			 
	 }
		

		function getURLParam(strParamName, url){
      var strReturn = "";
      var strHref = url;
      if ( strHref.indexOf("?") > -1 ){
        var strQueryString = strHref.substr(strHref.indexOf("?"));
        var aQueryString = strQueryString.split("&");
        for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
          if ( aQueryString[iParam].indexOf(strParamName + "=") > -1 ){
            var aParam = aQueryString[iParam].split("=");
            strReturn = aParam[1];
            break;
          }
        }
      }
      return unescape(strReturn);
    }
				
	 function buildJSClicks(elemnetClass, callTo) {
			var getClasses = $$(elemnetClass); // GET AN ARRAY OF ELEMENTS			


			getClasses.each(function(el, i) {			 
					 el.addEvent('click', function(e) {
        		    new Event(e).stop();
                if(callTo == "ajaxCounty") {
                   var hrefs = getClasses.getProperty('href');
                   var url = hrefs[i] || null;
								   ajaxCounty(getURLParam("county", url));
                }
								else if(callTo == "show_map")
								   show_map();	 	 
								else if(callTo == "hide_map")
								   hide_map();
								else if(callTo == "buildAdd") 
									 ajaxAdvertise(el);
								//else if(callTo == "preview") 
									 //ajaxPreviewAd(el);
					 });									
			}); 
	 }	
	 	 
	 function buildJSTips(element){
				        
        var myClass;				
				if(element.search("help") != -1){
				 	   myClass = "help";
			  }
				else if (element.search("links") != -1){
				 	   myClass = "links";				
				}
			
        var otherTips = new Tips($$(element).filterByAttribute('title'), {
    							 className: myClass,
    							 offsets: {'x': 2, 'y': 2},
                   onShow: function(tip){ 
                     tip.setStyle('opacity', '1.0'); 
                   },
                   onHide: function(tip){ 
                     tip.setStyle('visibility', 'hidden'); 
    							}
        });
        
	 }
	 
	 


