var obs = {};
obs.callback = {};
obs.config = {};
obs.util = {
    validatePostcode: function (val) {
        var Regex = {};
        Regex = /^([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,1}[0-9][A-Za-z]{2})$/;
        val = val.toUpperCase();
        if (val.match(Regex)) {
            return val;
        } else {
            return false;
        }
    },
   	EmailRegex: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,
    ForenameRegex: /^[a-zA-Z'\-\. ]{1,}$/,
    SurnameRegex: /^[a-zA-Z'\- ]{2,}$/,
    TelephoneRegex: /^\d{5} \d{5}\d?$/,
    CleanRegex: /(^\s+|\s+$)/g,
    validate : function(val, regex){
        if (val.match(regex)) {
            return val;
        } else {
            return false;
        }   
    },
    capitaliseString: function (InputString) {
        var SplitString = new Array;
        var OutputString = '';
        SplitString = InputString.split(/\b/);
        for (var i = 0; i < SplitString.length; i++) {
            if (SplitString[i].match(/^(de|des|di|dalla|della|der|den|du|von|van|fon|la|of|on|over|upon)$/)) {} else {
                if (SplitString[i].match(/^mc/)) {
                    SplitString[i] = SplitString[i].substr(0, 1).toUpperCase() + SplitString[i].substr(1, 1) + SplitString[i].substr(2, 1).toUpperCase() + SplitString[i].substr(3);
                } else if (SplitString[i].match(/^mac/)) {
                    SplitString[i] = SplitString[i].substr(0, 1).toUpperCase() + SplitString[i].substr(1, 2) + SplitString[i].substr(3, 1).toUpperCase() + SplitString[i].substr(4);
                } else {
                    SplitString[i] = SplitString[i].substr(0, 1).toUpperCase() + SplitString[i].substr(1);
                }
            }
        }
        OutputString = SplitString.join('');
        return OutputString;
    }

};
obs.dumpElement = function( element ) {

    var elementDump;

    // dump element attributes
    var attrDump = '';

    var attribute;
    var dumpedAttribute;
    for( var i = 0; i < element.attributes.length; i++) {

        attribute = element.attributes[i];

        // skip every not specified attribute (useful for example in IE)
        if ( attribute.specified == false ) continue;

        // current attribute dump
        dumpedAttribute = attribute.name + '="' + attribute.value + '"';

        // add current attribute to dump, separating attributes with whitespace
        attrDump += ((attrDump != '')?' ':'') + dumpedAttribute;
    }

    var tagName = element.tagName.toLowerCase();

    // note: innerHTML does not preserve code formatting
    // note: innerHTML on IE sets the tags names to uppercase (e.g. not W3C Valid)
    if( element.innerHTML == '' ) {

        // self closing tag syntax
        elementDump = '<' + tagName + ((attrDump != '')? ' '+attrDump : '') + '/>';  

    } else {

        elementDump = '<' + tagName + ((attrDump != '')? ' '+attrDump : '') + '>' +
            element.innerHTML +
            '</' + tagName + '>';
    }

    return elementDump;
};
obs.init = function (jq) {
    obs.jq = jq;
    obs.div = document.createElement("div");
    obs.jq(obs.div).attr("id", obs.config.id);
    obs.jq('body').append(obs.div);
    obs.jq(obs.div).hide();
    obs.bg = document.createElement("div");
    obs.jq(obs.bg).attr("id", obs.config.id + '-bg');
    obs.jq('body').append(obs.bg);
    obs.jq(obs.bg).hide();
    obs.css = document.createElement("link");
    obs.jq(obs.css).attr("type", "text/css").attr("rel", "stylesheet");
    obs.attach();
    obs.jq(window).resize(function () {
        var page_size = ___getPageSize();
        var page_scroll = ___getPageScroll();
        obs.jq(obs.bg).css({
            "width": page_size[0],
            "height": page_size[1]
        });
        obs.top_offset = page_scroll[1] + 70;
        obs.left_offset = (page_size[0] - obs.jq(obs.div).width()) / 2;
        obs.jq(obs.div).css({
            "top": obs.top_offset,
            "left": obs.left_offset
        });
    });
    obs.jq('link[href*="obs-print.css"]').each(function () {
        this.disabled = true;
    });
};
obs.attach = function () {
    var func = function (selector) {
      var arr = new Array();
      arr = obs.jq(selector);
      if(arr!=null) {
      for (var i=0;i<arr.length;i++) {
        var href = obs.jq(arr[i]).attr("href");
        if(href.match(/javascript/) != null) { //Already done
          continue;
        }
        else {
          var target = obs.jq(arr[i]).attr("href");
          obs.jq(arr[i]).attr("href", "javascript:void(0);");
          obs.jq(arr[i]).removeAttr("onclick");
          obs.jq(arr[i]).unbind("click");
          //Add args for taster links only.
          if(target.match(/obs_controller/) != null) {
            obs.jq(arr[i]).click(function () {
              obs.load(target);
            });
          }
          else { // otherwise, just call obs
            obs.jq(arr[i]).click(function () {
              obs.load();
            });
          }
        }
      }
      }
      else {
        return false;
      }
    };

    for (var i=0;i<obs.config.buttons.length;i++) {
      func(obs.config.buttons[i]);
    }
};
obs.runScripts = function () {
	obs.jq('script',obs.jq('#obs-wrap')).each(function(){
		eval(obs.jq(this).html());
	});
}
obs.callbackAttach = function () {

			obs.jq('#callback-popup').show();
			obs.jq('.callback-form').submit(function(e){
				e.preventDefault();
				// callbackAttach
			obs.jq('#callback-popup-content').load(obs.jq(this).attr('action')+ "?" + obs.jq(this).serialize()+" #content",obs.callbackAttach);
			
			});
}
obs.load = function (url, data) {
    var page_size = ___getPageSize();
    var page_scroll = ___getPageScroll();
    obs.jq(obs.bg).css({
        "width": page_size[0],
        "height": page_size[1],
        "opacity": "0.7",
        "filter": "alpha(opacity=30)",
        "position": "absolute",
        "top": "0",
        "left": "0",
        "background": "#000",
        "z-index": "999"
    });
    obs.jq(obs.bg).show();
    if (!url) {
        url = obs.config.url;
    }
    var load_div = document.createElement("div");
    var load_txt = document.createElement("h3");
    var load_logo = document.createElement("img");
    var load_img = document.createElement("img");
    obs.jq(load_txt).text("LOADING...");
    obs.jq(load_div).css({
        "text-align": "center",
        "margin": "100px 0 0 0"
    }).append(obs.jq(load_logo)).append(obs.jq(load_txt)).append(obs.jq(load_img));
    obs.jq(load_img).attr("src", "/site/images/obs/loading-bar.gif");
    obs.jq(load_logo).attr("src", "/site/images/obs/logo-spaced.gif");
    obs.jq(obs.div).empty().append(load_div).load(url, data, obs.stage_callback).show();
    if (obs.top_offset === undefined || obs.left_offset === undefined) {
        obs.top_offset = page_scroll[1] + 30;
        obs.left_offset = (page_size[0] - obs.jq(obs.div).width()) / 2;
    }
    obs.jq(obs.div).css({
        "top": obs.top_offset,
        "left": obs.left_offset
    });
    if (obs.jq.browser.msie) {
        obs.jq('#cta select').hide();
    }
    obs.jq('link[href*="obs-print.css"]').each(function () {
        this.disabled = false;
    });
};
obs.unload = function () {
    obs.jq(obs.bg).hide();
    obs.jq(obs.div).hide();
    obs.jq('#cta select').show();
    obs.jq('link[href*="obs-print.css"]').each(function () {
        this.disabled = true;
    });
    if (document.getElementById('my_appointments-content') ) {
        WidgetObj['my_appointments'].Pull(WidgetObj['my_appointments'].InitURL, 'my_appointments');
    }
};
obs.stage_callback = function (response) {

    obs.jq('#stage-3.stage-3-split').submit(function(){

    	IsValid = true;
    	
    	var context = $('#obs-wrap');
    	
    	/*
    	
    	// UNCOMMENT This block to activate validation for split version, part 2
    	
    	if(obs.jq('input[name=postcode]').length){

        	var postcode = obs.jq('input[name=postcode]').attr('value');
        	
        	if(!obs.util.validatePostcode(postcode)){
        		IsValid = false;
				obs.jq('input[name=postcode]').css('background','yellow');
			}else{
				obs.jq('input[name=postcode]').css('background','white');
			}
        
        }
        
        if(obs.jq('input[name=forename]').length){
    	
    		var forename = obs.jq('input[name=forename]').attr('value');
    		forename = forename.toLowerCase();
	        forename = forename.replace(obs.util.CleanRegex, "");
	        forename = forename.replace(/(\s)\s+/g, ' ');
	        forename = obs.util.capitaliseString(forename);
	        
	        if(!obs.util.validate(forename, obs.util.ForenameRegex)){
				IsValid = false;
				obs.jq('input[name=forename]').css('background','yellow');
			}else{
				obs.jq('input[name=forename]').css('background','white');
			}
    	
    	}
    	
    	if(obs.jq('input[name=surname]').length){
    		var surname = obs.jq('input[name=surname]').attr('value');
    		surname = surname.toLowerCase();
	        surname = surname.replace(obs.util.CleanRegex, "");
	        surname = surname.replace(/(\s)\s+/g, ' ');
	        surname = obs.util.capitaliseString(surname);
	        
	        if(!obs.util.validate(surname, obs.util.SurnameRegex)){
				IsValid = false;
				obs.jq('input[name=surname]').css('background','yellow');
			}else{
				obs.jq('input[name=surname]').css('background','white');
			}
    	}
    	*/
    
    	if(IsValid){
    	
    		obs.load(obs.config.url + "?" + obs.jq(this).serialize());
    	
    	}else{
    	
    		obs.jq('.error-message').fadeIn();
    	
    	}
    
    		
        return false;
    
    });
    obs.jq('#stage-3.stage-3-classic').submit(function(){
    
    	
    	var IsValid = true;
    	
    	/*
    	
    	To deactivate inline validation for stage 3, comment out from here...
    	
    	*/
    	
    	var context = $('#obs-wrap');
    	
    	
    	if(obs.jq('select[name=title]', context).length){
    	
    		var title = obs.jq('select[name=title]', context).attr('value');
	        
	        if(title===""){
				IsValid = false;
				obs.jq('select[name=title]', context).css('background','yellow');
			}else{
				obs.jq('select[name=title]', context).css('background','white');
			}
    	
    	}
    	
    	if(obs.jq('input[name=forename]', context).length){
    	
    		var forename = obs.jq('input[name=forename]', context).attr('value');
    		forename = forename.toLowerCase();
	        forename = forename.replace(obs.util.CleanRegex, "");
	        forename = forename.replace(/(\s)\s+/g, ' ');
	        forename = obs.util.capitaliseString(forename);
	        
	        if(!obs.util.validate(forename, obs.util.ForenameRegex)){
				IsValid = false;
				obs.jq('input[name=forename]', context).css('background','yellow');
			}else{
				obs.jq('input[name=forename]', context).css('background','white');
			}
    	
    	}
    	
    
    
    	if(obs.jq('input[name=surname]',context).length){
    		var surname = obs.jq('input[name=surname]', context).attr('value');
    		surname = surname.toLowerCase();
	        surname = surname.replace(obs.util.CleanRegex, "");
	        surname = surname.replace(/(\s)\s+/g, ' ');
	        surname = obs.util.capitaliseString(surname);
	        
	        if(!obs.util.validate(surname, obs.util.SurnameRegex)){
				IsValid = false;
				obs.jq('input[name=surname]',context).css('background','yellow');
			}else{
				obs.jq('input[name=surname]',context).css('background','white');
			}
    	}
        
        if(obs.jq('input[name=tel_eve]', context).length){
        
            var tel_eve = obs.jq('input[name=tel_eve]', context).attr('value');

	        tel_eve = tel_eve.replace(/\D+/g, '');
	        tel_eve = tel_eve.replace(/^44/, '');
	        tel_eve = tel_eve.replace(/^([^0]\d+)/, '0$1');
	        tel_eve = tel_eve.replace(/(\d{5})(\d+)/, '$1 $2');
	
			if(!obs.util.validate(tel_eve, obs.util.TelephoneRegex)){
				IsValid = false;
				obs.jq('input[name=tel_eve]', context).css('background','yellow');
			}else{
				obs.jq('input[name=tel_eve]', context).css('background','white');
			}

        }
    
        
        if(obs.jq('input[name=email]', context).length){
        
	        var email = obs.jq('input[name=email]', context).attr('value');
	        email = email.toLowerCase();
	        email = email.replace(obs.util.CleanRegex, ""); 
	        
	        if(!obs.util.validate(email, obs.util.EmailRegex)){
				IsValid = false;
				obs.jq('input[name=email]',context).css('background','yellow');
			}else{
				obs.jq('input[name=email]',context).css('background','white');
			}     
	        
        }
        
        /*
    	
    	.... to here. 
    	
    	*/
        
        	
        if(IsValid){
        	
        	obs.load(obs.config.url + "?" + obs.jq(this).serialize());
        	
        }else{
         
         	obs.jq('.error-message').fadeIn();
         	// Not valid

        
        }
       
        return false;
    });
    
    
    obs.jq('#obs-form-stage-1').submit(function () {
       // OBS v1.5:Validate the Stage 1 Form before submission
       
       
            var isValid = true;
            if(obs.util.validatePostcode(obs.jq('input[name=postcode]', obs.jq('#obs-form-stage-1')).val()) || (obs.jq('select[name=event_location]').val()!=="")){
            	obs.jq('#postcode-warning').fadeOut();
            }else{
            	obs.jq('#postcode-warning').fadeIn();
            	isValid = false;
            }
            if(obs.jq('input[name=lenses_wearer][value=yes]').attr('checked') || obs.jq('input[name=lenses_wearer][value=no]').attr('checked')){
            	
            	if(obs.jq('input[name=lenses_wearer][value=no]').attr('checked')){
            		
            		obs.jq('#lenses-warning').fadeOut();

            	}else{
            		if((obs.jq("input[name=lenses_type][value=soft]").attr('checked')) || (obs.jq("input[name=lenses_type][value=extended]").attr('checked')) || (obs.jq("input[name=lenses_type][value=hard]").attr('checked'))){
            			obs.jq('#lenses-warning').fadeOut();
            		
            		}else{
            			// Haven't selected the correct type of lenses
	            		isValid = false;
	            		obs.jq('#lenses-warning').fadeIn();
	            		
            		}
           		}
            	
            	
            }else{
            	// Not said whether or not they wear lenses
            	obs.jq('#lenses-warning').fadeIn();
            	isValid = false;
            }
            if(isValid){
         
            	 obs.load(obs.config.url + "?" + obs.jq(this).serialize());
            }
            
        return false;
    });
    obs.jq('a[href*="obs_controller"]').each(function () {
        var href = obs.jq(this).attr("href");
        obs.jq(this).attr("href", "javascript:void(0);");
        obs.jq(this).click(function () {
            obs.load(href);
        });
    });
    obs.jq("#obs-wrap #close-button").add("#obs-close a").each(function () {
        obs.jq(this).attr("href", "javascript:void(0);").unbind("click").click(function () {
            obs.load(obs.config.exit_url);
        });
    });
    obs.jq("input[type=button][rel]").each(function () {
        var url = obs.jq(this).attr("rel");
        obs.jq(this).unbind("click");
        obs.jq(this).click(function () {
            var form = obs.jq(obs.config.form_selector).serialize();
            if (form && url.match("\\?")) {
                url = url + '&' + form;
            }
            else if (form) {
                url = url + '?' + form;
            }
            obs.load(url);
        });
    });
    
    obs.jq('a[title="Request a call back"]',obs.jq('#call-back')).click(function(e) {
	
		e.preventDefault();
		var href = obs.jq(this).attr('href')+ " #content"; // Just load the content of the #content div
		obs.jq('#callback-popup-content').load(href, obs.callbackAttach);
		
	});
	
	
	obs.jq('#callback-popup-close').click(function(e){
	
		e.preventDefault();
		obs.jq('#callback-popup').fadeOut(500);
		
	
	});
	
	$('input[rel=prefill]',$('#obs-wrap')).each(function(){

		$('select[name=' + $(this).attr('className') + ']').val($(this).val());

		$('input[name=' + $(this).attr('className') + '][value='+$(this).val()+']').attr('checked','checked');

	});

    
    var stage = obs.jq("#stage-ident").attr("rel");
    if (stage && obs.callback.dt[stage] != undefined) {
        obs.callback.dt[stage]();
    }
};
obs.callback.obs_pre_filter = function (response) {

    obs.jq(obs.div).attr("class", "").addClass("stage-1");
    obs.jq("select[name=preferred_clinic] option").each(function () {
        var v = obs.jq(this).attr("value");
        var mapped_v;
        if (obs.config.clinic_map[v] != undefined) {
            mapped_v = obs.config.clinic_map[v];
        }
        else {
            mapped_v = obs.config.clinic_map._default(v);
        }
        obs.jq(this).attr("value", mapped_v);
    });
    /*
    obs.jq("select[name=event_location]");
    //__prefill();
    obs.jq("input[name=postcode][value=]").attr("value", "Enter your postcode");
    obs.jq("input[name=postcode]").focus(function () {
        obs.jq("input[name=postcode][value^=Enter]").attr("value", "");
    });
    */
    obs.jq("#contact-lens-type").hide();
    obs.jq("#lenses-warning").hide();
    obs.jq("#postcode-warning").hide();
    /*
    if (!(obs.jq("input[name=lenses_type][value=soft]").attr('checked')) && !(obs.jq("input[name=lenses_type][value=extended]").attr('checked')) && !(obs.jq("input[name=lenses_type][value=hard]").attr('checked'))) {
        obs.jq("input[name=lenses_wearer][value=yes]").attr('checked', '');
    }
    */
    
    if(obs.jq("input[name=lenses_wearer][value=yes]").attr('checked')){
		obs.jq("#contact-lens-type").show();
    }
    obs.jq("input[name=lenses_wearer][value=yes]").click(function () {
            obs.jq("#contact-lens-type").fadeIn();
    });
    obs.jq("input[name=lenses_wearer][value=no]").click(function () {
            obs.jq("#contact-lens-type").fadeOut();
    });
    
    obs.jq("input[name=lenses_type][value=soft]").click(function () {

       		obs.jq("#regular-lens-alert-message").fadeIn();
			obs.jq("#soft-lens-alert-message").hide();
			obs.jq("#hard-lens-alert-message").hide();  
	});
	obs.jq("input[name=lenses_type][value=extended]").click(function () {
	
            obs.jq("#regular-lens-alert-message").hide();
			obs.jq("#soft-lens-alert-message").fadeIn();
			obs.jq("#hard-lens-alert-message").hide();
	});
	obs.jq("input[name=lenses_type][value=hard]").click(function () {
	
      	    obs.jq("#regular-lens-alert-message").hide();
			obs.jq("#soft-lens-alert-message").hide();
			obs.jq("#hard-lens-alert-message").fadeIn();
	});
	obs.jq("#contact-tooltip-link").click(function () {
	
      	    obs.jq("#contact-tooltip").fadeIn();
      	    return false;
	});
	obs.jq("#contact-popup-close").click(function () {
	
      	    obs.jq("#contact-tooltip").fadeOut();
      	    return false;
	});
	
	obs.jq("#regular-lens-alert-message").hide();
	obs.jq("#soft-lens-alert-message").hide();
	obs.jq("#hard-lens-alert-message").hide();
	
};
obs.callback.obs_select_event = function () {

    obs.jq(obs.div).attr("class", "").addClass("stage-2");
    obs.jq('.day-events').hide();
    obs.jq('.event-count > a').attr('href', 'javascript:void(0);');
    obs.jq('.event-count').parent().hover(function () {
        obs.jq(this).find('.day-events').show();
        obs.jq(this).css({
            "z-index": 1060
        });
    }, function () {
        obs.jq(this).find('.day-events').hide();
        obs.jq(this).css({
            "z-index": 1050
        });
    });
    obs.jq('#filter').change(function () {
	
            obs.load(obs.config.url+"?obs_event_filter="+obs.jq('#filter').attr('value'));
	});
    obs.jq('.day-events').parent().parent().hover(function () {
        if (obs.jq.browser.msie) {
            obs.jq('.booking-info').hide();
        }
    }, function () {
        if (obs.jq.browser.msie) {
            obs.jq('.booking-info').show();
        }
    });
    obs.jq('.error-message').hide();
    //obs.jq('.promo').hide();
    //obs.jq("p.explanation").hide();
};
obs.callback.obs_post_filter = function () {

    obs.jq(obs.div).attr("class", "").addClass("stage-3");
    obs.jq('.error-message').hide();
    //obs.jq("p.explanation").hide();
};
obs.callback.obs_complete = function () {
    obs.jq(obs.div).attr("class", "").addClass("stage-4");
    obs.jq('.previous-clinic').hide();
    obs.jq('.next-clinic').hide();
    obs.jq('#change-event').hide();
    obs.jq('.booking-info').append('<a class="print-booking" href="javascript:window.print();">Print Booking</a>');
    obs.jq("#obs-close-window").add("#obs-close a").each(function () {
        obs.jq(this).attr("href", "javascript:void(0);").unbind("click").click(function () {
            obs.unload();
        });
    });
    obs.jq('.promo').hide();
    obs.jq("p.explanation").hide();
};
obs.callback.obs_early_exit = function () {
            obs.unload();
}
obs.callback.dt = {
    obs_pre_filter: obs.callback.obs_pre_filter,
    obs_select_event: obs.callback.obs_select_event,
    obs_post_filter: obs.callback.obs_post_filter,
    obs_complete: obs.callback.obs_complete,
    obs_early_exit: obs.callback.obs_early_exit
}

