﻿var $SuggestObject = function(){};

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  Suggest JSON Begin
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  Configuration Settings, use # notation for JQuery IDs
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$SuggestObject.Json = function() 
{
    this.TextInputId = "#Term";
    this.TextSelectedDataId = "#LocationSuggested";
    this.ResponseContainerId = "#SuggestContainer";
    this.SubmitSearch = function()
    {
        window.location.href = String.Format("/{0}/{1}", $("input[name=Channel]:checked").val(), $("#LocationSuggested").val());
    };
};

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  CloseSuggest
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$SuggestObject.Json.prototype.CloseSuggest = function() 
{
    $($Suggest.ResponseContainerId).html("");
    $($Suggest.ResponseContainerId).removeClass("open closed");
    $($Suggest.ResponseContainerId).addClass("closed");
};
    
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  SuggestSelect
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$SuggestObject.Json.prototype.SuggestSelect = function(num) 
{
    
    $($Suggest.TextSelectedDataId).val($("#suggest-data-" + num).attr("name"));
    $($Suggest.TextInputId).val($("#suggest-data-" + num).html().replace(/<[^>]+>/g,""));
    $Suggest.CloseSuggest();
};

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  TotalSuggestMatches
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$SuggestObject.Json.prototype.TotalSuggestMatches = function() 
{
    return $($Suggest.ResponseContainerId + " > div").length;
};

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  ScrollToItem
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$SuggestObject.Json.prototype.ScrollToItem = function(elepos) 
{
    $($Suggest.ResponseContainerId + " > div").toggleClass("suggest-over", false);
    $("#suggest-data-" + elepos).toggleClass("suggest-over", true);
    
};
    
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  CurrentSuggestIndex of selection
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$SuggestObject.Json.prototype.CurrentSuggestIndex = function() 
{
    var LIS = $($Suggest.ResponseContainerId + " > div");
    var T = -1;
    for (var x = 0; x < LIS.length; x++) 
    {
        if (LIS[x].className.indexOf("suggest-over") > -1) 
        {
            T = x;
            break;
        }
    }
    return T;
};
    
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  Stops processing Events
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$SuggestObject.Json.prototype.StopProcessingEvents = function(e) 
{
    if (e && e.preventDefault) 
    {
        e.preventDefault();
        return false;
    }
    else if (window.event && window.event.returnValue) 
    {
        window.eventReturnValue = false;
    }
};
    
    
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  OnKeyUp (event, suggest text object) Hookup Event
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$(document).ready(function()
{
    $($Suggest.TextInputId).keyup(function(e)
    {
    //````````````````````````````````````````````````````````````````
    // KeyNum = int indicating which key was pressed
    //````````````````````````````````````````````````````````````````
    var KeyNum;         
    if (window.event) // ie
    {
        KeyNum = e.keyCode;
    }
    else if (e.which) // all others
    {
        KeyNum = e.which;
    }
    
    switch (KeyNum)
    {
        //````````````````````````````````````````````````````````````````
        case 13: // enter key
            if ($($Suggest.ResponseContainerId).hasClass("open")) 
            {
                $Suggest.CloseSuggest();
                $Suggest.StopProcessingEvents(e);
//                $.log("Enter Key Released");
//                return false;
            }
            $.log("Enter Key Released");
            Search();
            return false;
            break;
        //````````````````````````````````````````````````````````````````
        case 27: // escape key
            $Suggest.CloseSuggest();
            $.log("Escape Key Released");
            return false;
            break;
        //````````````````````````````````````````````````````````````````
        case 40: // arrow down key
            $Suggest.ScrollToItem($Suggest.CurrentSuggestIndex() + 1);
            $.log("Down Key Released: index " + parseFloat($Suggest.CurrentSuggestIndex() + 1));
            break;
        //````````````````````````````````````````````````````````````````
        case 38: // arrow up key
            $Suggest.ScrollToItem($Suggest.CurrentSuggestIndex() - 1);
            $.log("Up Key Released: index " + parseFloat($Suggest.CurrentSuggestIndex() - 1));
            break;
        //````````````````````````````````````````````````````````````````
        default: // any other key
            $.log(String.fromCharCode(KeyNum) + " Key Released (" + KeyNum + ")");
            $("#LocationSuggested").val("");
            if ($($Suggest.TextInputId).val().length > 1) 
            {
                var Url=String.Format("{0}Service.aspx?Channel={1}&SearchType=Suggest&MaxReturns=10&ReturnType=json&Term={2}", CacheObject.SearchServiceRoot, CacheObject.Channel, $($Suggest.TextInputId).val());
                $.ajax({
                  type: "GET",
                  contentType: "application/json; charset=utf-8",
                  url: Url,
                  data: "{}",
                  dataType: "jsonp",
                  error: function(XMLHttpRequest, textStatus, errorThrown)
                  {
                    $Suggest.CloseSuggest();  
                    $.log("Json Error Message: error(" + errorThrown + ") \"" + textStatus + "\""); 
                  },
                  success: function(response) 
                  {
                      //````````````````````````````````````````````````````````````````
                      // Insert the returned HTML into the <div>.
                      // This method is called ASYNCHRONOUSLY
                      // so it is not aware of variables in it's scope.
                      //````````````````````````````````````````````````````````````````                   
                      var thishtml = "";
                      
                      if (response.group && 
                            response.group.length>0 && 
                            response.group[0].option &&
                            response.group[0].option.length > 0)
                      {
                            $("#LocationSuggested").val(""); // refresh if suggest opens
                            
                          for(var x=0;x<response.group[0].option.length;x++)
                          {
                              var template = "<div class=\"suggest-data\" id=\"suggest-data-{0}\" name=\"{1}\" onmousedown=\"$Suggest.SuggestSelect({2})\" onmouseover=\"$Suggest.ScrollToItem({3})\">{4}</div>";
                              thishtml += String.Format(template, x, response.group[0].option[x].valueseo, x, x, response.group[0].option[x].title);
                          }
                          //document.getElementById("SuggestJsonContainer").innerHTML = thishtml;
                          
                          $($Suggest.ResponseContainerId).html(thishtml);
                          $($Suggest.ResponseContainerId).toggleClass("open", true).toggleClass("closed", false);
                          //alert((new $SuggestObject.Json()).ResponseContainerId);
                      }
                      else
                      {
                            $Suggest.CloseSuggest();  
                            $.log("Suggest Term \"" + $($Suggest.TextInputId).val() + "\" = No Matches");                        
                      }
                  }
                });
            }
            else 
            {
                $Suggest.CloseSuggest();
                $.log("Suggest Term \"" + $($Suggest.TextInputId).val() + "\" = Too Short"); 
            }
            break;
        }
    })
});

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  OnKeyDown (event, suggest text object) Hookup Event
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$(document).ready(function()
{
    $($Suggest.TextInputId).keydown(function (e)
    {
        //````````````````````````````````````````````````````````````````
        // KeyNum = int indicating which key was pressed
        //````````````````````````````````````````````````````````````````
        var KeyNum;         
        if (window.event) // ie
        {
            KeyNum = e.keyCode;
        }
        else if (e.which) // all others
        {
            KeyNum = e.which;
        }
        
        //````````````````````````````````````````````````````````````````
        // Switch KeyNum and respond on a per case basis
        //````````````````````````````````````````````````````````````````
        switch(KeyNum)
        {
            //````````````````````````````````````````````````````````````````
            case 13: // enter key
                if ($($Suggest.ResponseContainerId).hasClass("open")) 
                {
                    if ($Suggest.CurrentSuggestIndex() > -1) 
                    {
                        $Suggest.SuggestSelect($Suggest.CurrentSuggestIndex());
                        $Suggest.StopProcessingEvents(e);
                        $.log("Enter Key Down");
                        return false;
                    }
                    
                    if ($Suggest.TotalSuggestMatches() == 1)
                    {
                        $Suggest.SuggestSelect(0);
                        $.log("Enter Key Down");
                        return false;
                    }
                }
                $.log("Enter Key Down");
                Search();
                return false;
                break;
            //````````````````````````````````````````````````````````````````
            case 27: // escape key
                $Suggest.CloseSuggest();
                $.log("Escape Key Down");
                return false;
                break;
            //````````````````````````````````````````````````````````````````
            case 40: // arrow down key
                $.log("Down Key Pressed");
                break;
            //````````````````````````````````````````````````````````````````
            case 38: // arrow up key
                $.log("Up Key Pressed");
                break;
            //````````````````````````````````````````````````````````````````
            default:
                $.log(String.fromCharCode(KeyNum) + " Key Down (" + KeyNum + ")");
                return true;
                break;
        }
    })
});

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  Blur - Hookup Event
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$(document).ready(function()
{
    $($Suggest.TextInputId).blur(function ()
    {
        $Suggest.CloseSuggest();
        $($Suggest.TextInputId).css('font-color', '#ccc');
    })
});

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  Double Click - Hookup Event
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$(document).ready(function()
{
    $($Suggest.TextInputId).dblclick(function ()
    {
        $($Suggest.TextInputId).css('font-color', '#000');
        $($Suggest.TextInputId).val('');
    })
});

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  Globalize It
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
var $Suggest = new $SuggestObject.Json();

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  Suggest JSON End
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

