﻿YBAutoComplete =
 {
     blnInit: false,
     minChars: 3,
     maxChars: 18,
     url: "",
     resultset: null,
     currentKeyword: "",
     currentCity: -1,
     cityCombo: null,
     selectedItemIndex: -1,
     containerDiv: null,
     innerDiv: null,
     displayTimeout: 400,
     displayTimer: null,
     input: "",
     REPLACECHARS: [["Ğ", "ğ"], ["İ", "i"], ["Ş", "ş"], ["I", "ı"], ["-", " "]],
     KEY: {
         LEFT: 37,
         UP: 38,
         RIGHT: 39,
         DOWN: 40,
         TAB: 9,
         RETURN: 13,
         ESC: 27,
         COMMA: 188,
         PAGEUP: 33,
         PAGEDOWN: 34,
         BACKSPACE: 8,
         SHIFT: 16
     },

     enabled: true,

     enable: function() {
         YBAutoComplete.enabled = true;
         YBAutoComplete.performSearch();
     },

     disable: function() {
         YBAutoComplete.hideAll();
         YBAutoComplete.enabled = false;
     },

     init: function() {
         if (!this.blnInit) {
             this.selectedItemIndex = -1;
             this.containerDiv = jQuery("<div id='YBAutoCompleteDiv' class='YBAutoCompleteOuterDiv'><div id='YBAutoCompleteInnerDiv' class='YBAutoCompleteInnerDiv' /><iframe style=\"position: absolute; display: block; z-index: -1; width: 100%; height: 100%; _width: 500px; _height: 500px; top: 0; left: 0; filter: mask(); background-color: #ffffff; \"></iframe></div>").appendTo(document.body);

             this.innerDiv = jQuery("#YBAutoCompleteInnerDiv");
             this.containerDiv.css("display", "none");
             // var inputBox = document.getElementById(this.input);



             // this.containerDiv.css("left", inputBox.offsetLeft);
             // this.containerDiv.css("top", inputBox.offsetTop + inputBox.offsetHeight);

             var inputElementLocation = jQuery("#" + YBAutoComplete.input + ":first").offset();

             this.containerDiv.css("left", inputElementLocation.left);
             this.containerDiv.css("top", inputElementLocation.top + 19);


             jQuery("#" + this.input).attr("autocomplete", "off");

             var liElements = "#YBAutoCompleteDiv > div > ul > li";

             jQuery("#" + this.input).keydown(function(event) {
                 event.cancelBubble = true;
                 if (event.keyCode == YBAutoComplete.KEY.RETURN) {
                     if (YBAutoComplete.selectedItemIndex >= 0) {
                         event.preventDefault();
                         document.location = jQuery(liElements + ":eq(" + YBAutoComplete.selectedItemIndex + ") > a").attr("href");
                     }
                 }
             });

             jQuery("#" + this.input).keyup(function(event) {
                 event.cancelBubble = true;

                 switch (event.keyCode) {
                     case YBAutoComplete.KEY.LEFT:
                         event.preventDefault();
                         event.cancelBubble = true;
                         break;
                     case YBAutoComplete.KEY.RIGHT:
                         event.preventDefault();
                         event.cancelBubble = true;
                         break;
                     case YBAutoComplete.KEY.DOWN:
                         event.preventDefault();
                         event.cancelBubble = true;
                         var itemCount = jQuery(liElements).length;
                         if (YBAutoComplete.selectedItemIndex == itemCount - 1) {
                             YBAutoComplete.selectedItemIndex = -1;
                         }
                         YBAutoComplete.selectedItemIndex += 1;
                         YBAutoComplete.paintSelected(liElements, YBAutoComplete.selectedItemIndex);
                         break;
                     case YBAutoComplete.KEY.UP:
                         event.preventDefault();
                         var itemCount = jQuery(liElements).length;
                         if (YBAutoComplete.selectedItemIndex <= 0) {
                             YBAutoComplete.selectedItemIndex = itemCount;
                         }
                         YBAutoComplete.selectedItemIndex -= 1;
                         YBAutoComplete.paintSelected(liElements, YBAutoComplete.selectedItemIndex);
                         break;
                     case YBAutoComplete.KEY.SHIFT:
                         break;

                     case YBAutoComplete.KEY.RETURN:
                         if (YBAutoComplete.selectedItemIndex >= 0) {
                             event.preventDefault();
                             document.location = jQuery(liElements + ":eq(" + YBAutoComplete.selectedItemIndex + ") > a").attr("href");
                         }
                         break;
                     default:
                         if (YBAutoComplete.enabled) {
                             YBAutoComplete.performSearch();
                         }
                         else {
                             YBAutoComplete.hideAll();
                         }
                         break;
                 }

             });
             jQuery("#" + YBAutoComplete.cityCombo).bind("change", YBAutoComplete.performSearch);
             this.blnInit = true;
         }
     },

     performSearch: function() {
         var keyword = jQuery("#" + YBAutoComplete.input)[0].value;
         var city = jQuery("#" + YBAutoComplete.cityCombo)[0].value;

         //keyword = YBAutoComplete.replaceTurkishChars(keyword);

         if (keyword != undefined &&
             (keyword != YBAutoComplete.currentKeyword || YBAutoComplete.currentCity) &&
             keyword.length >= YBAutoComplete.minChars &&
             keyword.length <= YBAutoComplete.maxChars) {

             clearTimeout(YBAutoComplete.displayTimer);
             YBAutoComplete.autoComplete(keyword, city);
             YBAutoComplete.currentKeyword = keyword;
             YBAutoComplete.currentCity = city;
         }
         else {
             if (keyword.length < YBAutoComplete.minChars) {
                 YBAutoComplete.currentKeyword = "";
             }
             YBAutoComplete.hideAll();
         }
     },

     replaceTurkishChars: function(keyword) {
         for (var i = 0; i < YBAutoComplete.REPLACECHARS.length; ++i) {
             keyword = keyword.replace(YBAutoComplete.REPLACECHARS[i][0], YBAutoComplete.REPLACECHARS[i][1]);
         }

         return keyword;
     },

     paintSelected: function(liElements, index) {
         jQuery(liElements + " > a").css("background-color", "white");
         var currentItem = jQuery(liElements + ":eq(" + index + ") > a");
         if (currentItem.id == "srchPopupAllAdsLink") {
             currentItem.css("background-color", "red");
         }
         else {
             currentItem.css("background-color", "#f1f6f0");
         }
     },

     hideAll: function() {
         if (YBAutoComplete.containerDiv != undefined && YBAutoComplete.innerDiv != undefined && YBAutoComplete.containerDiv.css('display') != "none") {
             YBAutoComplete.innerDiv.html("");
             YBAutoComplete.containerDiv.css("display", "none");
         }
     },

     showAll: function(result) {
         this.innerDiv.html("<a class='popup_close' href='javascript:void(0);' onclick='YBAutoComplete.hideAll();'>&nbsp;</a>" + result);
         this.containerDiv.css("display", "");

     },

     generatePopupHTML: function(jsonData) {
         var result = "<ul>";
         for (var i = 0; i < jsonData.length; ++i) {
             if (jsonData[i] != undefined && jsonData[i] != null) {
                 switch (jsonData[i].type) {
                     case "HTML":
                         result += jsonData[i].text;
                         break;
                     case "AdTitle":
                         result += "<li><a href='" + jsonData[i].link + "'>" + YBAutoComplete.highlight(jsonData[i].text, YBAutoComplete.currentKeyword) + "</a></li>";
                         break;
                     case "Sector":
                         result += "<li><a href='" + jsonData[i].link + "'>" + YBAutoComplete.highlight(jsonData[i].text, YBAutoComplete.currentKeyword) + "</a></li>";
                         break;
                     case "JobCategory":
                         result += "<li><a href='" + jsonData[i].link + "'>" + YBAutoComplete.highlight(jsonData[i].text, YBAutoComplete.currentKeyword) + "</a></li>";
                         break;
                 }
             }
         }
         result += "</ul>";

         this.showAll(result);
     },

     highlight: function(value, term) {
         return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
     },

     autoComplete: function(keyword, city) {
         YBAutoComplete.displayTimer = setTimeout("YBAutoComplete.getJSON('" + keyword + "'," + city + ")", YBAutoComplete.displayTimeout);
     },

     getJSON: function(keyword, city) {
         var qs = "?q=" + encodeURIComponent(keyword);
         if (city >= 0) {
             qs += "&c=" + city;
         }

         $.ajax({ 
            url: this.url + qs,
            dataType: "text",
            success: function(text) {
                data = eval("(" + text + ")");
                YBAutoComplete.resultset = eval(data);
                if (YBAutoComplete.resultset.length == 0) {
                    YBAutoComplete.currentKeyword = "";
                    YBAutoComplete.hideAll();
                }
                else {
                    if (YBAutoComplete.currentKeyword.indexOf(keyword) >= 0) {
                        YBAutoComplete.selectedItemIndex = -1;
                        YBAutoComplete.generatePopupHTML(data);
                    }
                }
            }
         });         
     }
 };
