
/*

    Usage: jQuery("#elemID").storeSelector({option1:value,option2:value});
    Example: 
            <div id="wrap">
                <input class="search" type="text" />
                <ul class="subs" />
                <ul class="shops" />
            </div>
            jQuery("#wrap").storeSelector({suburbSearch:".search", suburbs:".subs", stores:".shops"});
*/

(function($){
    $.fn.storeSelector = function(options) {
        
        // deafult options
        var defaults = {
            suburbSearch: "input.suburbSearch",
            suburbs: "ul.suburbs",
            stores: "ul.stores",
            selectMode: "myStore",
            maxSuburbs: 100,
            maxStores: 100
        }
        // options override
        var opts = $.extend(defaults, options);
        
        var t = this;
        t.orgSearchTerm = "";

        // binding keys for suburb search
        $(defaults.suburbSearch, t).attr("autocomplete","off").keyup(function(event){
            var searchTerm = $(this).val();
            if(searchTerm && searchTerm.length > 2){
                if(t.orgSearchTerm != searchTerm){
                    getSuburbs(searchTerm);
                }
            }else{
                $(defaults.suburbs).empty().hide();
            }
            t.orgSearchTerm = searchTerm;
        });

        // binding keys for arrow/tab/enter navigation
        $(defaults.suburbSearch, t).attr("autocomplete","off").keydown(function(event){
            if(event.keyCode == 38 | event.keyCode == 40 | event.keyCode == 13 | event.keyCode == 9)
            {
		        if (event.preventDefault) event.preventDefault();
		        if (event.stopPropagation) event.stopPropagation();        
		        event.cancelBubble = true;
                highliteSuburb(event.keyCode);
            }
        });        
    
        // retrieves suburbs
        function getSuburbs(term) {
            $.ajax({
                type: "POST",
                url: "/webservices/storelocator.asmx/GetLocalitySuggestions",
                data: "{term:'" + term + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(data) {
                    $(defaults.suburbs, t).empty();
                    if(data){
                        var x = 0;
                        $.each(data, function(i, val) {
                          if(x++ < defaults.maxSuburbs){
                              var rep = new RegExp(term, "gi");
                              var el = document.createElement("li");
                              var a = document.createElement("a");
                              $(a).bind("click", {lat:val.Latitude, lon:val.Longitude} , selectSuburb);
                              a.href = "javascript:void(0);";
                              //alert(val.Suburb);
                              a.innerHTML  = val.Suburb.replace(rep, "<strong>$&</strong>") + " - " + val.State + ", " + val.Postcode.replace(rep, "<strong>$&</strong>");
                              $(el).append(a);
                              $(defaults.suburbs, t).append(el);
                          }
                        });
                        $(defaults.suburbs, t).show();
                    }else{
                        $(defaults.suburbs, t).hide();
                    }
                }
            });
        }
        
        function selectSuburb(data){
            $(defaults.suburbs + " a", t).removeClass("highlite");
            $(this).addClass("highlite");
            getNearLocations(data.data.lat, data.data.lon);
        }
        
        function selectStore(data){
            setUserStore(data.data.storeID);
        }
        
        // Retrieves stores near a lat/lon
        function getNearLocations(lat,lon)
        {
            $.ajax({
                type: "POST",
                url: "/webservices/storelocator.asmx/GetLocationsNearGeoPoint",
                data: "{brandIDs:[3],latitude:" + lat + ", longitude:" + lon + ", radius:5, features:[]}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(data) {
                    $(defaults.stores, t).empty();
                    //alert(data);
                    if(data != ""){
                        var x = 0;
                        $.each(data, function(i, val) {
                          if(x++ < defaults.maxStores){
                              var el = document.createElement("li");
                              var a = document.createElement("a");
                              a.innerHTML = "Liquorland " + val.Suburb + " - " + val.Address;
                              
                              if(defaults.selectMode == 'myStore'){
                                $(a).bind("click", {storeID:val.StoreID}, selectStore);
                                a.href = "javascript:void(0);";
                              }else{
                                a.href = val.StoreUrl;
                              }
                              $(el).append(a);
                              $(defaults.stores, t).append(el);
                          }
                        });
                    }else{
                          var el = document.createElement("li");
                          var a = document.createElement("a");
                          $(a).addClass("nostorefound");
                          a.innerHTML = "No stores were found in this search. <br/>Please select your state for a full store list.";
                          $(el).append(a);
                          $(defaults.stores, t).append(el);
                    }
                }
            });
        }
        
        function setUserStore(id){
            jQuery.ajax({
                type: "POST",
                url: "/webservices/storelocator.asmx/SetUserStore",
                data: "{storeID:'" + id + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(data) {
                    __doPostBack('__Page','');
                }
            });
        }
        
        // Highlights suburb with arrows/tab keys. Enter key loads stores.
        function highliteSuburb(keycode){
            
            var indexHL = 0;
            var arrItems = $(defaults.suburbs + " li a", t);
            var numItems = arrItems.length;
            var found = false;
            var currItem = null;
            
            if(numItems > 0)
            {
                $(arrItems).each(function (index, domEle){
                    if($(domEle).hasClass("highlite")){
                        indexHL = index;
                        found = true;
                        currItem = domEle;
                    }
                });
                
                if(keycode == 13 && currItem)
                {
                    $(currItem).trigger("click");
                    return;
                }
                
                if(keycode == 38)
                    indexHL--;
                else
                    indexHL++;
                
                if(!found)
                    indexHL = 0
                else if(indexHL < 0)
                    indexHL = numItems - 1
                else if(indexHL > numItems - 1)
                    indexHL = 0
                    
                $(arrItems).removeClass("highlite");    
                $(arrItems).each(function (index, domEle){
                    if(indexHL == index)
                        $(domEle).addClass("highlite"); 
                });   
            }
        }
}
})(jQuery);
