﻿/* Copyright (c) Hoseasons Holidays Limited
* Author: Chris O'Brien
* Date: 7 May 2010
*/

jQuery.fn.hosAutoComplete = function(options) {
    return this.each(function() {
        var settings = jQuery.extend({
            $container: null,
            serviceMethod: "",
            maxNumberOfResults: 15,
            anchorHref: "ProductDetailPage?ACODE={VALUE}&SCODE="
        }, options);
        var $this = $(this);
        var container = settings.$container;
        var hasContent = false;
        var mouseOverContainer = false;
        var urlBeginning = settings.anchorHref.slice(0, settings.anchorHref.indexOf("{VALUE}"));
        var urlEnd = settings.anchorHref.slice(settings.anchorHref.indexOf("{VALUE}") + 7);
        var selectedAnchor = null;

        $this.get(0).value = "";

        $this.keydown(function(e) {
            if (e.which == 13) { // Enter key
                if (selectedAnchor != null) selectedAnchor.click();
                else {
                    $("#accommodationSearchErrorMsg").html("Code/Name could not be found.");
                    return false;
                }
            }
        });

        $this.keyup(function(e) {
            if (hasContent && e.which == 38) { // Up key
                if (selectedAnchor != null) selectedAnchor.click();
            } else if (hasContent && e.which == 38) { // Up key
                if (selectedAnchor != null && selectedAnchor.prev().length != 0) {
                    selectedAnchor.removeClass("selected");
                    selectedAnchor = selectedAnchor.prev();
                    selectedAnchor.addClass("selected");
                }
            } else if (hasContent && e.which == 40) { // Down key
                if (selectedAnchor != null && selectedAnchor.next().length != 0) {
                    selectedAnchor.removeClass("selected");
                    selectedAnchor = selectedAnchor.next();
                    selectedAnchor.addClass("selected");
                }
            } else if (this.value.length > 1) {
                PageMethods[settings.serviceMethod](this.value, settings.maxNumberOfResults, CallSuccess);
            } else {
                container.css("display", "none");
                hasContent = false;
            }
        });

        $this.blur(function(e) {
            if (!mouseOverContainer) container.css("display", "none");
        });

        $this.focus(function(e) {
            if (hasContent) showContainer();
        });

        container.hover(function(e) { mouseOverContainer = true; }, function(e) { mouseOverContainer = false; });

        function showContainer() {
            container.css("top", $this.position().top + 24 + "px"); // See approx line 300 of jquery.ui.datepicker.js
            container.css("left", $this.position().left + "px");
            container.css("display", "block");
        }

        container.find("a").live("mouseenter", function(e) {
            if (selectedAnchor != null) selectedAnchor.removeClass("selected");
            selectedAnchor = $(this);
            selectedAnchor.addClass("selected");
        });

        function CallSuccess(res) {
            container.html("");
            var data = eval(res);
            var value;
            if (data.length > 0) {
                for (var k = 0; k < data.length; k++) {
                    value = data[k].value.split('_');
                    container.append(["<a href='", urlBeginning, value[0], urlEnd + value[0] + "&RCODE=" + value[1], "' onclick='$(\"#" + $this.get(0).id + "\").val(this.innerHTML); window.location = this.href;'>", data[k].text, "</a>"].join(""));
                }
                showContainer();
                selectedAnchor = container.find("a").first();
                selectedAnchor.addClass("selected");
                hasContent = true;
            } else {
                container.css("display", "none");
                hasContent = false;
                selectedAnchor = null;
            }
            
        }

    });
};