// Form lookup
var FORM_CRITERIA = "form.criteria-panel";

// Misc
var ACCORDIONHEADERS = "form.criteria-panel fieldset ul.accordion li a.header";
var MODELSELECTIONITEMS = "div.model-panel div.model-item-inner a.add-button";

// Controls
var CONTROL_LISTIMAGES = "div.imagelist fieldset > img";
var CONTROL_IMAGEGROUP = "fieldset.imagegroup";
var CONTROL_SEARCHTAB = "ul.state-menu li a.search";
var CONTROL_SEARCHBUTTON = "form.criteria-panel input.search-button";
var CONTROL_MODELLINKS = "div.model-panel div.model-item-inner a";
var CONTROL_VALIDATIONSUMMARY = "div.validation-summary";
var CONTROL_OVERLAY = "div.overlay";
var CONTROL_MESSAGETEMPLATE = "div.template-message";
var CONTROL_MESSAGES = "div.messages";

// Fields
var FIELD_POSTCODE = "input.postcode";
var FIELD_RANGE = "select.range";

//SH:TestTrack 2958, Changed the RegExpr
var rePostCode = /^([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})$/g

//SH:TestTrack 2958, Subaru RegExpr 
var rePostCode_CheckFormat= /^((([A-PR-UWYZ](\d([A-HJKSTUW]|\d)?|[A-HK-Y]\d([ABEHMNPRVWXY]|\d)?))\s*(\d[ABD-HJLNP-UW-Z]{2})?)|GIR\s*0AA)$/gi;


var rePostCode_BS7666 = /^[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z-[CIKMOV]]{2}$/gi;
var rePostCode_BS7666FULL = /^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW]) [0-9][ABD-HJLNP-UW-Z]{2})$/gi;

$(document).ready(function()
    {      
		//disable check we have a postcode
		$("form.criteria-panel").bind("submit", function(e) {
			if(!checkSearch()) {
				return false;
			}
		});

    
        // setup image list controls
        $(FORM_CRITERIA).find(CONTROL_LISTIMAGES).click(
            function() {
                var container = $(this).parent(CONTROL_IMAGEGROUP);
                var image = $(this);
                
                handleImageClickonListControl(container,image);
            }
        );
        
        // setup search submit event on search button
        $(CONTROL_SEARCHBUTTON).click(
            function (event) {
                if (!checkSearch())
                    event.preventDefault();
            }
        );
        
        // setup search submit event on search tab
        $(CONTROL_SEARCHTAB).click(
            function (event) {
                event.preventDefault();
                frm = $(FORM_CRITERIA)[0];
                changeFormAction(this.href,frm);
                if (checkSearch())
                    submitForm(frm);
            }
        );
        
        // setup model selection event click
        $(CONTROL_MODELLINKS).click(
            function (event) {
            event.preventDefault();
            frm = $(FORM_CRITERIA)[0];
            changeFormAction(this,frm);
            submitForm(frm);
            }
        );
 
        //setup the jscrollpane settings for the third criteria panel
		$("form.criteria-panel fieldset.scroll-pane").jScrollPane(
		{
			scrollbarWidth : 16,
			height:255,
			width:250
		});
		
		//ok first we need to calculate how many models we have rendered as selected
		//each of the selected models repesents 90px of height including their own padding
		//we then need to add another 5px on the bottom to leave sum space
		var selectedModelCount = $('form.criteria-panel div.scroll-pane').children('div.model-item-outer').length;
		var contentHeight = (90 * selectedModelCount) + 5;
		
		//setup the jscrollpane settings for the third criteria panel
		$("form.criteria-panel div.scroll-pane").jScrollPane(
		{
			scrollbarWidth : 16,
			height:255,
			width:250,
			contentHeight:contentHeight
		});
    });
    
    
    /*
    ********************************
    * ADDED FUNCTION
    ********************************
    */
    
    function toggleModelSelection(targetJQueryObjectRef)
    {
        //alert('bob');
        
        return false;
    }
    
    function toggleAccordionState(targetJQueryObjectRef)
	{
		var _this = targetJQueryObjectRef;
		
		if (_this.hasClass("selected"))
		{
			_this.removeClass("selected");
		}
		else
		{
			_this.addClass("selected");
		}
		
		return false;
	}
	
	// Start : Check functions
	function checkSearch()
	{
        clearValidationMessages();
        
        var pcStatus = false;
        var rStatus = false;
        
        pcStatus = checkPostCode();
        rStatus = checkRange();
                
        if (!pcStatus || !rStatus)
        {
            showValidationSummary();
            return false;
        }
        else
            return true;
	}
	
	function checkRange()
	{
	    var status = true;
	    var message = "";
	    var title = "Model";
	    var frmCriteria = $(FORM_CRITERIA);
	    var selectRange = frmCriteria.find(FIELD_RANGE);
	    //If we are on a centre search don't validate this element.
	    if (frmCriteria.find('ul.ui-accordion li.criteria-models').length == 0) return true;
	    var modelCheck = frmCriteria.find('ul.ui-accordion li.criteria-models div.models div.jScrollPaneContainer div.scroll-pane div.model-item-outer');
	    if ($(modelCheck).length == 0) 
	    {
	    	status = false;
	    	title += " Required";
	    	message = "To perform a search you must select a model. Please select a model, this can be done from the model selection tab.";
	    }
	    
//	    if (selectRange && selectRange[0] != null)
//	    {
//	        if (!validateRequiredField(selectRange[0]))
//	        {
//	            status = false;
//                title += " Required";
//	            message = "To perform a search you must select a model. Please select a model, this can be done from the model selection tab.";
//	        }
//	    }
	    
        if (!status)
            addValidationMessage(selectRange[0],title,message);
    
        setValidStatus(selectRange[0], status);
        
        return status;
	}
	
	function checkPostCode()
	{
	    var status = true;
	    var message = "";
	    var title = "Postcode";
	    var frmCriteria = $(FORM_CRITERIA);
	    var inputPostCode = frmCriteria.find(FIELD_POSTCODE);
	    	    
	    //SH:TestTrack 2958, called the 'formatPostcode' method from /common/assets/js/utilities/common.js to format user input correctly 
        formatPostcode(inputPostCode);
         	    	    
	    // Check input
	    if (inputPostCode && inputPostCode[0])
	    {
	        // Check required
	        if (!validateRequiredField(inputPostCode[0]))
	        {
	            status = false;
	            title += " Required";
	            message = "Postcode is a required field, please enter a postcode to continue.";
	        }
	        
	        // Check content
	        if (status && !validatePostCode(inputPostCode[0]))
	        {
	            status = false;
	            title += " Invalid";
	            message = "The postcode you have entered is invalid, please enter a valid postcode to continue.";
	        }
	        

	        //SH:TestTrack 2958, Subaru RegExpr 
	        if (status && !validatePostCodeFormat(inputPostCode[0]))
	        {
	            status = false;
	            title += " Invalid";
	            message = "The postcode you have entered is invalid, please enter a valid postcode to continue.";
	        }
	              
	        
	        // These only need to occur if the postcode input is defined.	        
	        if (!status)
	            addValidationMessage(inputPostCode[0],title,message);
	    
	        setValidStatus(inputPostCode[0], status);
	    }	    
	    
	    return status;
	}
	// End : Validate functions
	
	function addValidationMessage(e,title,message)
	{
	    // Get controls
	    var controlValidation = $(CONTROL_VALIDATIONSUMMARY);
	    var controlMessages = $(CONTROL_VALIDATIONSUMMARY).find(CONTROL_MESSAGES);
	    var controlMessage = controlValidation.find(CONTROL_MESSAGETEMPLATE).clone();
	    
	    // Setup control text
	    controlMessage.find("h2.title").html(title);
	    controlMessage.find("p.description").html(message);
	    controlMessage.attr("class","message");
	    
	    // Add message
	    controlMessages.append(controlMessage);
	}
	
	function showValidationSummary()
	{
	    // Get controls
	    var controlValidation = $(CONTROL_VALIDATIONSUMMARY);
	    var controlOverlay = $(CONTROL_OVERLAY);

	    controlValidation.find("a.exit").click(
	        function(event)
	        {
	            event.preventDefault();
	            hideValidationSummary();
	        }
	    );
	    
	    // Show control
	    setControlDisplay(controlOverlay,true);
	    setControlDisplay(controlValidation,true);
	}
	
	function hideValidationSummary()
	{
	    // Get controls
	    var controlValidation = $(CONTROL_VALIDATIONSUMMARY);
	    var controlOverlay = $(CONTROL_OVERLAY);
	    
	    // Hide control
	    setControlDisplay(controlOverlay,false);
	    setControlDisplay(controlValidation,false);
	}
	
	function setControlDisplay(control,status)
	{
	   if (status)
	   {
	    if (control.hasClass("hidden"))
	        control.removeClass("hidden");
	   }
	   else
	   {
	    if (!control.hasClass("hidden"))
	        control.addClass("hidden")
	   }	   
	}
	
	function setValidStatus(e, isValid)
	{
		if(e) {
			var parent = $(e.parentNode);
			if (!isValid)
			{
				//if (e.focus) e.focus();
				//if (e.select) e.select();
		        
				if (!parent.hasClass("invalid"));
					parent.addClass("invalid");
			}
			else
			{
				if (!parent.hasClass("invalid"));
					parent.removeClass("invalid");
			}
	    }
	}
	
	function clearValidationMessages()
	{
	    // Get controls
	    var controlValidation = $(CONTROL_VALIDATIONSUMMARY);
	    var controlMessages = $(CONTROL_VALIDATIONSUMMARY).find(CONTROL_MESSAGES);
	    controlMessages.empty();
	}
	
	
	
	// Start : Validate functions
	function validatePostCode(e)
	{
	    var pattern = rePostCode;
	    return (!hasValue(e) || (e.value.match(pattern)));
	}
	
	
	//SH:TestTrack 2958, Subaru RegExpr 
	function validatePostCodeFormat(e)
	{
	    var pattern = rePostCode_CheckFormat;
	    return (!hasValue(e) || (e.value.match(pattern)));
	}
	
	function validateRequiredField(e)
    {
        var result=true;
        if (e.tagName.toLowerCase()=='input')
        {
            result = hasValue(e);
        }
        else if (e.tagName.toLowerCase()=='select')
        {
            result = ((e.selectedIndex>=0) && (hasValue(e)));
        }
        return result;
    }	
	// End : Validate functions
	
	// Start : String Functions	
	function trimString(str)
            {
                return str.replace(/^\s+|\s+$/g,'');
            }
	
	function hasValue(e)
    {
        return (e.value && trimString(e.value)!='');
    }
    // End : String Functions	
    
	// Start : Form Functions
	
	function changeFormAction(link,frm)
	{
	    frm.action = link;
	}
	
	function submitForm(frm)
	{
	    frm.submit();
	}
	
	// End : From Functions
	
	// Start : Handler for image list
	
	function handleImageClickonListControl(container, image)
	{
	    if (container.hasClass("single"))
	    {
	        images = container.children(CONTROL_LISTIMAGES);
	        for (i = 0; i < images.length; i++)
	        {
	            if (images[i].tagName == 'IMG')
	                setListImage($(images[i]),false);
	        }
	    }
	    
	    if (image.hasClass("selected"))
        {
            // De-Select
            setImageGroupValue(container, stringAfterLast(image.attr("id"),"_"));
            setListImage(image,false);
        }
        else
        {
            // Select
            setImageGroupValue(container, stringAfterLast(image.attr("id"), "_"));
		    setListImage(image,true);
        }
	}
	
	function setListImage(image,status)
	{
	    if (status)
	    {
	        // add
	        image.addClass("selected");
		    image.attr("src", image.attr("src").replace("up","down"));
	    }
	    else
	    {
	        // remove
	        image.removeClass("selected");
            image.attr("src",image.attr("src").replace("down","up"));
	    }
	}
	
	function setImageGroupValue(container, toggleValue)
    {
	    //get our hidden field that stores the data.
	    var hiddenField = container.children("input:hidden");
	    //Get what format the hidden field data needs to be stored as.
	    var valueFormat = stringAfterLast(container.attr("class"), " ");
    	
	    switch(valueFormat)
	    {
		    case "single" :
		        // Set hidden value
		        hiddenField[0].value = toggleValue;
		        break;
		    case "sum" :
			    //Convert our value to an integer.
			    toggleValue = parseInt(toggleValue);
			    //If our value is undefined then set it to a string value.
			    if(!hiddenField.attr("value"))
			    {
				    hiddenField.attr("value", toggleValue);
			    }
			    else
			    {
				    //Check if the bit has already been set and add or remove it accordingly.
				    if((parseInt(hiddenField.attr("value")) & toggleValue) == toggleValue)
				    {
					    hiddenField.attr("value", parseInt(hiddenField.attr("value")) - toggleValue);
				    }
				    else
				    {
					    hiddenField.attr("value", parseInt(hiddenField.attr("value")) + toggleValue);
				    }
			    }
			    //If we have no selected items clear the value as 0 is the equivelent of none selected.
			    if(hiddenField.attr("value") == "0") hiddenField.attr("value", "");
			    break;
    			
		    default :
			    if(!hiddenField.attr("value"))
			    {
				    hiddenField.attr("value", toggleValue);
			    }
			    else
			    {
				    var valueArray = hiddenField.attr("value").split(",");
    				
				    if(jQuery.inArray(toggleValue, valueArray) > -1)
				    {
					    valueArray.splice(jQuery.inArray(toggleValue, valueArray),1);
					    hiddenField.attr("value", valueArray.join(","));
				    }
				    else
				    {
					    valueArray.push(toggleValue)
					    hiddenField.attr("value", valueArray.join(","));
				    }
			    }
			    break;
		}
		hiddenField.trigger("change");
    }
    
    function stringAfterLast(data, character)
	{
		return (data.lastIndexOf(character) > 0) ? data.substring(data.lastIndexOf(character) + 1, data.length) : data;
	}
	
	// End : Handler for image list