﻿/*  SEARCHOBJECT.JS
*
*   Controls the search object control that manages the search function of the website
*
*   Author: John Sundell
*/

//Constructor
$(document).ready(function(){

    searchobject.init();

});

//Object
var searchobject = {

    init: function () {

        //Build infobox
        this.buildInfoBox();

        //Register elements
        this.registerElements();

        //Register events
        this.registerEvents();

        //Check if user is on search page
        this.searchPageFunctions();

    },

    registerElements: function () {

        this.elements = {};

        this.elements.searchField = $("#txtSearchString");
        this.elements.searchButton = $("#searchButton");
        this.elements.infoBox = $("#searchInfoBox");
        this.elements.infoBoxLink = this.elements.infoBox.find("a");
        this.elements.startPageSearchField = $("#object-search-input");
        this.elements.startPageSearchButton = $("#object-search-submit");

    },

    registerEvents: function () {

        //Store elements in local variable
        var elements = this.elements;

        //Focus and blur for the searchfield
        elements.searchField.bind("focus blur", searchobject.focusToggled);

        //Toggle mouseover for infoBox-link
        elements.infoBoxLink.hover(function () {
            $(this).data("mouseover", true);
        },
        function () {
            $(this).data("mouseover", false);
        });

        //Searchbutton clicked
        elements.searchButton.bind("click", function () {
            searchobject.submit(searchobject.elements.searchField.val());
        });

        //Prevent ASP.NET form submission on enter click
        elements.searchField.bind("keydown", function (e) {
            if (e.keyCode == 13) {
                return false;
            }
        });

        //Searchfield keypress functions
        elements.searchField.bind("keyup", function (e) {

            //Submit on enter
            if (e.keyCode == 13) {
                searchobject.submit();
            }

            //Check if "search too short"-message should be hidden when displayed
            if (searchobject.elements.infoBox.hasClass("searchTooShort")) {

                //Get searchfield
                var searchField = searchobject.elements.searchField;

                //Check so that searchstring has become long enough
                if (searchField.val().length > 1 && searchField.val() != searchobject.properties.placeHolderText) {

                    //Get infobox
                    var infoBox = searchobject.elements.infoBox;

                    infoBox.hide();
                    infoBox.removeClass("searchTooShort");
                    infoBox.find(".info").html(searchobject.interfaces.abroadInfo);

                }
            }

        });

        //Start page object search control functionality
        elements.startPageSearchField.bind("keydown", function (e) {
            if (e.keyCode == 13) {
                return false;
            }
        });

        elements.startPageSearchField.bind("keyup", function (e) {

            //Submit on enter
            if (e.keyCode == 13) {
                searchobject.submit($(this).val());
            }

        });

        elements.startPageSearchButton.bind("click", function () { searchobject.submit(searchobject.elements.startPageSearchField.val()); });

    },

    focusToggled: function () {

        //Gather info
        var element = searchobject.elements.searchField,
            placeHolderText = searchobject.properties.placeHolderText,
            searchString = element.val();

        //On focus
        if (document.activeElement == element[0]) {

            //Is placeholder text currently visible? -> If so remove it and change text style
            if (searchString == searchobject.properties.placeHolderText) {
                element.val("");
                element.addClass("has-value");
            }

            //Show infoBox
            searchobject.elements.infoBox.show();

        }

        //On blur
        else {

            //Is textfield empty? -> If so add the placeholder text
            if (element.val() == "") {
                element.val(placeHolderText);
                element.removeClass("has-value");
            }

            //Hide infoBox if mouse is not over link
            if (searchobject.elements.infoBoxLink.data("mouseover") != true) {
                searchobject.elements.infoBox.hide();
            }

        }

    },

    submit: function (submitString) {

        //Get searchfield value
        var searchString = submitString || searchobject.elements.searchField.val();
        
        //Search won't get submitted if searchfield is empty
        if (searchString.length > 1 && searchString != searchobject.properties.placeHolderText) {

            //Redirect to search-page and add value to URL
            window.location = "/sok/?find=" + encodeURIComponent(searchString.replace(/\'/g,"").replace(/^\s\s*/, '').replace(/\s\s*$/, ''));

        }
        else if (searchString.length < 2) {

            if (!submitString) {

                //Get infobox
                var infoBox = searchobject.elements.infoBox;

                //Set interface of infobox
                infoBox.find(".info").html(searchobject.interfaces.searchTooShort);

                //Add class to infobox
                infoBox.addClass("searchTooShort");

                //Show infoBox
                infoBox.show();

            }

        }

    },

    searchPageFunctions: function () {

        //Is user on the search page?
        if (window.location.href.toLowerCase().indexOf(this.properties.searchPage) >= 0) {

            //If find paramter can be found, set search field to it and change font style (don't do this when performing an office search)
            if (getUrlParameter("find") != "" && getUrlParameter("mode") != "officeSearch") {
                this.elements.searchField.val(getUrlParameter("find")).addClass("has-value");
            }

        }

    },

    buildInfoBox: function () {

        //Build element
        $("#mainContainer").append('<div id="searchInfoBox"><div class="arrow-border"></div><div class="arrow"></div><div class="info">Söker du boende utanför Sverige?<a href="/sok/?mode=abroadSearch"> Visa utlandsbostäder</a></div></div>');

    },

    interfaces: {

        abroadInfo: 'Söker du boende utanför Sverige?<a href="/sok/?mode=abroadSearch">Visa utlandsbostäder</a>',

        searchTooShort: 'Vänligen ange minst 2 bokstäver som sökord.'

    },

    properties: {

        placeHolderText: "Sök bostad",
        searchPage: "/sok/"

    }

};
