﻿var t = {};
(function(Danel, Config) {
    var _controls;
    var _baseurl = "http://" + document.location.hostname + "/";
    var requests = [];
    Danel.UrlQuery = false;
    Danel.UrlListenr = {
        ListenerInterval: null,
        LastUrl: null,
        Events: {
            onUrlChange: []
        },
        startListening: function() {
            LastUrl = document.location;
            this.ListenerInterval = setInterval(this.listen(), 300);
        },
        listen: function() {
        },
        stopListening: function() {
        },

        addEvent: function(type, func) {
            if (!Events[type]) return false;
            this.Events[type].push(func);
            return true;
        },
        clearEvents: function(type) {
            if (!Events[type]) return false;
            this.Events[type] = [];
            return true;
        }
    }

    var SplitGenderString = function(s) {
        var rules = [
                { match: new RegExp("(נ|ה?)\\/(ות|נית|[תה]|ית)(\\s|$)", "g"), male: { match: new RegExp("\\/([תה]|ית|ות|נית)(?=(\\s|$))", "g"), replace: "" }
                , female: { match: new RegExp("ה?\\/(?=(ות|נית|[תה]|ית)(\\s|$))", "g"), replace: "" }
                },
                { match: new RegExp("ים\\/ות(\\s|$)", "g"), male: { match: new RegExp("ים\\/ות(?=(\\s|$))", "g"), replace: "ים" }
                , female: { match: new RegExp("ים\\/(?=ות(\\s|$))", "g"), replace: "" }
                },
                { match: new RegExp("איש\\/אשת(\\s|$)", "g"), male: { match: new RegExp("איש\\/אשת(?=(\\s|$))", "g"), replace: "איש" }
                , female: { match: new RegExp("איש\\/(?=אשת(\\s|$))", "g"), replace: "" }
                }
            ];

        var o = { male: s, female: s };
        var bSplit = false;
        for (var i = 0; i < rules.length; i++) {
            if (o.male.match(rules[i].match)) {
                o.male = fixLiteralEndingChars(o.male.replace(rules[i].male.match, rules[i].male.replace));
                bSplit = true;
            }
            if (o.female.match(rules[i].match)) {
                o.female = fixLiteralEndingChars(o.female.replace(rules[i].female.match, rules[i].female.replace));
                bSplit = true;
            }
        }

        function fixLiteralEndingChars(s) {
            var q = [{ n: 'כ', e: 'ך' }, { n: 'פ', e: 'ף' }, { n: 'מ', e: 'ם' }, { n: 'נ', e: 'ן' }, { n: 'צ', e: 'ץ'}];
            for (var i = 0; i < q.length; i++) {
                var re = new RegExp(q[i].e + "(?=[א-ת])");
                var re2 = new RegExp(q[i].n + "(?=([\\s().,]|$))");
                if (re.test(s)) {
                    s = s.replace(re, q[i].n);
                }
                if (re2.test(s)) {
                    s = s.replace(re2, q[i].e);
                }
            }
            return s;
        }
        if (bSplit) return o;
        return null;
    }

    var tipStyle = {
        "style": {
            padding: 5,
            width: 150,
            "textAlign": "center",
            tip: true,
            border:
                                {
                                    width: 3,
                                    radius: 5,
                                    color: "#8f8f8f"
                                }
        },
        "position":
                            {
                                "corner": {
                                    target: "topRight",
                                    tooltip: "leftBottom"
                                }
                            }
    };

    var checkLoad = function() {
        if (requests.length === 0) {
            initControls();
            if (Danel.UrlController.ParseURLParams()) {
                Danel.UrlQuery = true;
                Danel.requestSearchResults();
            }
        }
    };

    Danel.initNewSearchPanel = function() {
        jQuery(".NewSearchPanel .FieldDropList").each(function() {
            if (!this.control || !this.control.config) { return; }
            if (Danel.SearchRequest.Filters[this.control.config.field].isEmpty()) { return; }
            jQuery(this).val(Danel.SearchRequest.Filters[this.control.config.field].getValue().value.split(",")[0]);
        });
        jQuery(".NewSearchPanel .SearchButton").click(function() {

            var flag1 = true;
            jQuery(".NewSearchPanel .FieldDropList").each(function() {
                if (!this.control || !this.control.config || !this.control.config.required) { return; }
                flag1 = jQuery(this).val() != "-1";
            });
            if (!flag1) { return; }

            for (var filter in Danel.SearchRequest.Filters) {
                if (Danel.SearchRequest.Filters.hasOwnProperty(filter)) {
                    if (typeof Danel.SearchRequest.Filters[filter] != "function") {
                        Danel.SearchRequest.Filters[filter].setValue();
                    }
                }
            }
            jQuery(".NewSearchPanel .FieldDropList").each(function() {
                if (!this.control || !this.control.config) { return; }
                var val = jQuery(this).val();
                if (val == "-1") { return; }
                var text = jQuery("option:selected", this).text();
                Danel.SearchRequest.Filters[this.control.config.field].setValue({ "item": "", "text": text, "value": jQuery(this).val() });
            });
            Danel.requestSearchResults();
        });
    };

    var _CVFrameWrapper;
    Danel.getCVFrameWrapper = function(useCache) {
        if (!_CVFrameWrapper) {
            var iframe = document.createElement("iframe");
            iframe.frameBorder = "0";
            _CVFrameWrapper = jQuery("<div/>").css({ "zIndex": 1103, "width": 560, "overflowX": "hidden", "position": "fixed", "visibility": "hidden" }).appendTo(document.body).get(0);
            _CVFrameWrapper.IFrame = jQuery(iframe).attr("scrolling", "no").attr("frameborder", "0").attr("border", "0").addClass("SendCVFrame").css({ "marginRight": "580px" }).appendTo(_CVFrameWrapper).get(0);
            _CVFrameWrapper.renew = true;
            _CVFrameWrapper.interact = function() {
                _CVFrameWrapper.renew = true;
                //alert(_CVFrameWrapper.renew);
            };

            _CVFrameWrapper.checkReload = function() {
                if (_CVFrameWrapper.getSendButton() == null) {
                    _CVFrameWrapper.load();
                }
            };

            _CVFrameWrapper.load = function() {
                jQuery(_CVFrameWrapper.IFrame).contents().html("");
                _CVFrameWrapper.IsActive = false;
                jQuery(_CVFrameWrapper.IFrame).attr("src", _baseurl + "JobSearch/SendCV.aspx?PositionId=dm&dmode=IFrame");
                var init = function() {
                    if (_CVFrameWrapper.IsActive) { return; }
                    var send = jQuery(".SendButton input", jQuery(_CVFrameWrapper.IFrame).contents());
                    clearInterval(_CVFrameWrapper.Timer);
                    jQuery(_CVFrameWrapper.IFrame).contents().find("#Body").css({ "overflow": "hidden" });
                    _CVFrameWrapper.SendButton = jQuery(_CVFrameWrapper.IFrame).contents().find('.SendButton input').get(0);
                    _CVFrameWrapper.PositionInput = jQuery(_CVFrameWrapper.IFrame).contents().find('.HiddenPositionsInput').get(0);
                    jQuery(_CVFrameWrapper).trigger("Active");
                    _CVFrameWrapper.IsActive = true;
                };

                _CVFrameWrapper.Timer = setInterval(function() {
                    var state = jQuery(_CVFrameWrapper.IFrame).contents().get(0).readyState;

                    if (state == "complete") { init(); }

                }, 100);
                jQuery(_CVFrameWrapper.IFrame).load(init);
            }
            _CVFrameWrapper.load();
        }

        _CVFrameWrapper.getSendButton = function() {
            try {
                _CVFrameWrapper.SendButton = jQuery(_CVFrameWrapper.IFrame).contents().find('.SendButton input').get(0);
                _CVFrameWrapper.PositionInput = jQuery(_CVFrameWrapper.IFrame).contents().find('.HiddenPositionsInput').get(0);
            }
            catch (ex) {
                return null;
            }
            return _CVFrameWrapper.SendButton;
        }
        //alert(_CVFrameWrapper.renew);
        return _CVFrameWrapper;
    };

    Danel.CurrentPosition = null;



    Danel.BasicList = function() {
        var rowindex = 0;
        this.getNextIndex = function() { return rowindex++; };
        this.addItem = function(item) { return (this[item._index = this.getNextIndex()] = item); };
        this.deleteItem = function(item) { delete this[item._index]; };
        this.getItems = function() {
            var arr = [];
            for (var a in this) {
                if (this.hasOwnProperty(a)) {
                    if (typeof this[a] == "function") { continue; }
                    arr.push(this[a]);
                }
            }
            return arr;
        };
    };
    /*
    Danel.BasicList.prototype = jQuery.extend(Danel.BasicList.prototype,{
    getNextIndex : function(){return this.rowindex++;},
    addItem: function(item){return (this[item._index=this.getNextIndex()]=item)},
    deleteItem: function(item){delete this[item._index];}
    });
    */

    Danel.DataItem = function() {
        this.getValue = function(sender) {
            return this.value;
        };
        this.setValue = function(value, sender) {

            this.value = value;
            var binds = Danel.getDataBinds(this);
            for (var i = 0; i < binds.length; i++) {
                if (binds[i].control.dataBind && binds[i].control !== sender) { binds[i].control.dataBind(value, binds[i].key, this); }
            }
        };
    };
    Danel.AjaxUrl = _baseurl + "JobSearch/Ajax/";

    Danel.UrlController = {};
    Danel.UrlController.ParseURLParams = function() {
        var hash = {
            "f": "Fields",
            "p": "Professions",
            "a": "Areas",
            "c": "Populations",
            "s": "Scopes"
        };


        var reg = "jobsearch/(?=[^-]{1,5}-)(f?p?a?c?s?)-(.+?).aspx(#(p?c?s?)-(.+))?";
        var m = String.prototype.match.call(String.prototype.toLowerCase.call(document.location), reg);
        if (m === null || m === undefined) { return false; }
        var fields = m[1];
        var values = decodeURI(m[2]).replace(/_/g, " ");
        if (m[3]) { fields += m[4]; values += "," + decodeURI(m[5]).replace(/_/g, " "); }
        values = values.split(",");
        if (fields.length != values.length) { return false; }
        var parseWild = function() {
            Danel.WildCardController.parseWildCard(this, [field]);
        };
        for (var i = 0; i < fields.length; i++) {
            var c = fields.charAt(i);
            var field = hash[c];
            var cvalues = values[i].split("+");
            jQuery.each(cvalues, parseWild);
        }
        return true;
    };

    Danel.UrlController.CreateUrl = function(searchRequest) {
        var str = _baseurl + "JobSearch/";
        str += (searchRequest.Filters.Fields.getValue() && searchRequest.Filters.Fields.value.text != "") ?
                        searchRequest.Filters.Fields.value.text : "משרות";
        str += "+";
        str += (searchRequest.Filters.Professions.getValue() && searchRequest.Filters.Professions.value.text != "") ?
                        searchRequest.Filters.Professions.value.text : "כל מקצוע";
        str += "+ב";
        str += (searchRequest.Filters.Areas.getValue() && searchRequest.Filters.Areas.value.text != "") ?
                        searchRequest.Filters.Areas.value.text : "כל הארץ";
        str += "+ל";
        str += (searchRequest.Filters.Populations.getValue() && searchRequest.Filters.Areas.value.text != "") ?
                        searchRequest.Filters.Populations.value.text : "כל אוכלסיה";
        str += "+ב";
        str += (searchRequest.Filters.Scopes.getValue() && searchRequest.Filters.Areas.value.text != "") ?
                        searchRequest.Filters.Scopes.value.text : "כל היקף משרה";
        var wild = searchRequest.WildCards.getItems();
        if (wild.length > 0) {
            str += "\\";
            for (var i = 0; i < wild.length; i++) {
                if (i !== 0) { wild += ","; }
                str += wild[i].value.value;
            }
        }
        str += ".aspx";
        return str;

    };
    Danel.UrlController.ParseUrl = function() {
    };


    Danel.WildCardController =
       {
           getWordCombinations: function(data) {
               /*
               var fn = function(comb,array)
               {
               if (array.length==1) return array;
               var item = comb.pop();
               if (item!="") item+=" ";
               item += array.shift();
               comb.push(item + " " + array.shift());
               return comb.concat(fn(comb, array));
               }
               */
               var arr = data.split(" ");
               var combinations = [];
               for (var i = 0; i < arr.length; i++) {
                   var item = arr[i];
                   combinations.push(item);
                   for (j = i; j < arr.length; j++) {
                       item += " " + arr[j];
                       combinations.push(item);
                   }
               }
               return combinations;
           },

           parseWildCard: function(data, fields) {

               var distinct = function(text) {
                   var arr = text.split(",");
                   var data = {};
                   var newtext = arr.shift();
                   data[newtext] = true;
                   jQuery.each(arr, function() {
                       if (data[this]) { return; }
                       newtext += ",";
                       newtext += this;
                   });
                   return newtext;
               };


               var filters = {};
               jQuery.each(fields, function() {
                   filters[this] = { "value": "", "text": "" };
               });
               var combinations = this.getWordCombinations(data);
               for (var i = 0; i < fields.length; i++) {
                   var strvalue = "";
                   var strtext = "";
                   var dic = Danel.getDictionary(fields[i]);
                   for (var j = 0; j < combinations.length; j++) {
                       for (var key in dic) {
                           if (typeof (dic[key]) == "function") { continue; }
                           //fireunit.ok(typeof (dic[key]) == "Object");
                           var val = dic.getValue(key);
                           if ((val.replace("/", "").indexOf(combinations[j]) > -1 || val.replace("/[^\s*]", "").indexOf(combinations[j]) > -1) && (combinations[j].length / val.replace("/", "").length) > 0.1) {
                               if (filters[fields[i]].value != "") {
                                   filters[fields[i]].text += ",";
                                   filters[fields[i]].value += ",";
                               }
                               filters[fields[i]].value += key;
                               filters[fields[i]].text += val;

                               if (dic[key].item.FieldId && Danel.getDictionary("Fields").getValue(dic[key].item.FieldId) !== null) {
                                   if (!filters.Fields) { filters.Fields = { value: "", text: "" }; }
                                   if (filters.Fields.value != "") {
                                       filters.Fields.value += ",";
                                       filters.Fields.text += ",";
                                   }
                                   filters.Fields.value += dic[key].item.FieldId;
                                   filters.Fields.text += Danel.getDictionary("Fields").getValue(dic[key].item.FieldId);

                               }


                           }
                       }
                   }
               }


               for (var x in filters) {
                   var tfilter = Danel.SearchRequest.Filters[x];
                   var value = tfilter.getValue();
                   if (tfilter.isEmpty()) {
                       tfilter.setValue({ "text": distinct(filters[x].text), "value": distinct(filters[x].value) });
                   }
                   else {
                       var valobject = tfilter.getValue();
                       valobject.value += "," + filters[x].value;
                       valobject.text += "," + filters[x].text;
                       tfilter.setValue({ "text": distinct(valobject.text), "value": distinct(valobject.value) });
                       /*
                       value.value += "," + filters[x].value;
                       value.text += "," + filters[x].text;
                       */
                   }

               }
           }
       };

    //Danel.WildCardController.getWordCombinations("ישי אוכל שווארמה2");
    Danel.Cache = {};
    Danel.CacheController = {
        getCache: function(searchRequest) {
            return Danel.Cache[this.getCacheKey(searchRequest)];
        },

        checkCache: function(searchRequest) {
            return !!(Danel.Cache[this.getCacheKey(searchRequest)] || Danel.CacheController.filterCache(searchRequest));
        },


        getCacheKey: function(searchRequest) {
            var sr = this.minifySearchRequest(searchRequest);
            return JSON.stringify(sr);
        },

        minifySearchRequest: function(searchRequest) {
            if (searchRequest.IsMinified) { return searchRequest; }
            var sr = { Filters: {}, IsMinified: true };
            for (var key in searchRequest.Filters) {
                if (searchRequest.Filters[key].isEmpty()) { continue; }
                sr.Filters[key] = searchRequest.Filters[key].value.value;
            }
            return sr;
        },

        addCache: function(searchRequest, searchResults) {
            var str = this.getCacheKey(searchRequest);
            Danel.Cache[str] = searchResults;
        },

        filterCache: function(searchRequest) {
            var cacheentry;
            searchRequest = this.minifySearchRequest(searchRequest);
            var filterResults = function() {
                var newData = [];
                for (var i = 0; i < cacheentry.length; i++) {
                    var row = cacheentry[i];
                    var flag = true;
                    for (var f in searchRequest.Filters) {
                        var filter = searchRequest.Filters[f];

                        if (row[f] === null || row[f] === undefined || row[f] == "") { continue; }
                        var filters = filter.split(",");
                        var flag1 = false;
                        for (var x = 0; x < filters.length; x++) {
                            if (row[f].indexOf(filters[x]) == -1) { continue; }
                            flag1 = true;
                            break;
                        }
                        if (!flag1) {
                            flag = false;
                            break;
                        }
                    }
                    if (flag) { newData.push(row); }
                }
                Danel.CacheController.addCache(searchRequest, newData);
                return true;
            };

            for (var c in Danel.Cache) {

                var sr = JSON.parse(c);
                var flag1 = true;
                for (var filter in sr.Filters) {
                    var sfilter = sr.Filters[filter];

                    if (!searchRequest.Filters[filter]) {
                        flag1 = false;
                        break;
                    }
                    if (searchRequest.Filters[filter] == sfilter) { continue; }
                    if (sfilter.split(",") > 1) {
                        var flag2 = true;

                        var values = searchRequest.Filters[filter].split(",");
                        for (var i = 0; i < values.length; i++) {
                            if (sfilter.indexOf(values[i]) == -1) {
                                flag2 = false;
                                break;
                            }
                        }
                        if (flag2) { continue; }
                    }

                    flag1 = false;
                    break;
                }
                if (flag1 === true) {
                    cacheentry = Danel.Cache[c];
                    break;
                }
            }

            return (!!(cacheentry) ? filterResults() : false);
        }
    };

    Danel.Controls = {};
    Danel.DataBinds = new Danel.BasicList();
    Danel.View = 0;
    Danel.TemplateController = {
        TemplateBaseUrl: _baseurl + "DesktopModules/DanelSearch/Templates/",

        Templates: [],

        loadTemplate: function(name) {
            var url = this.TemplateBaseUrl + name + ".htm";
            var _self = this;
            jQuery.ajax({ url: url, dataType: "text", success: function(data) {
                _self.Templates.push({ "name": name, "template": data });
            }
            });
        },

        getTemplate: function(name) {
            for (var i = 0; i < this.Templates.length; i++) {
                if (this.Templates[i].name == name) { return this.Templates[i].template; }
            }
        },

        init: function() {

        }
    };
    Danel.getSearchData = function(searchRequest, callback) {
        var url = Danel.AjaxUrl + "GetSearchResults.ashx";
        /*
        if (!searchRequest.Filters.Professions.isEmpty() &&
        !searchRequest.Filters.Fields.isEmpty() )
        {
        var profF =  searchRequest.Filters.Professions.getValue();
        var fieF = searchRequest.Filters.Fields.getValue();
        var newprof = {"value":"","text":"","item":""};
        var profarr = profF.value.split(",");
        var strValue ="";
        var strText =""
        var profdic = Danel.getDictionary("Professions");
        var bChange = false;
        for (var x=0;x<profarr.length;x++)
        {
        var dicentry = profdic[profarr[x]];
        if (fieF.value.indexOf(dicentry.item.FieldId)!=-1)
        {
        if (newprof.value!="")
        {
        newprof.value+=",";
        newprof.text+=",";
        }
        newprof.text += dicentry.value;
        newprof.value += profarr[x];
        }
        else
        {
        bChange=true;
        }
        }
        if (bChange) searchRequest.Filters.Professions.setValue(newprof);
        }
        */

        var args = { searchParams: [] };
        var wildcards = searchRequest.WildCards.getItems();
        for (var i = 0; i < wildcards.length; i++) {
            args.searchParams.push({ name: "wild", value: wildcards[i].value.value });
        }
        for (var key in searchRequest.Filters) {
            if (!searchRequest.Filters[key].value || searchRequest.Filters[key].value == "") { continue; }
            args.searchParams.push({ name: key, value: searchRequest.Filters[key].value.value });
        }


        args.searchParams = JSON.stringify(args.searchParams);
        if (!Danel.CacheController.checkCache(searchRequest)) {

            jQuery.ajax({ url: url, dataType: "text", data: args, success:
               function(data) {
                   //data =  eval('(' + data.replace(/\"\\\/Date\((\d+)\)\\\/\"/g, "new Date($1)") + ')');
                   data = Sys.Serialization.JavaScriptSerializer.deserialize(data);
                   Danel.CacheController.addCache(jQuery.extend(true, {}, searchRequest), jQuery.extend(true, [], data));
                   callback.apply(this, arguments);
               }
            });
        }
        else {
            callback.call(this, Danel.CacheController.getCache(searchRequest));
        }
        while (wildcards.length > 0) {
            wildcards.shift();
        }
    };
    Danel.switchView = function() {

    };
    Danel.SearchResults = {};

    Danel.SearchResults.data = new Danel.DataItem({ name: "", value: [], item: [] });
    Danel.requestSearchResults = function(searchRequest) {
        if (!searchRequest) { searchRequest = Danel.SearchRequest; }
        if (Danel.View == 1) {
            jQuery(".FilterBox", Danel.SmartSearchControl).each(function() {
                jQuery(this).dropdownchecklist("enable");
            });
        }

        if (Danel.View === 0) {
            //var animationT = (Danel.UrlQuery) ? 0 : 600;
            if (!Danel.UrlQuery) {
                jQuery(".SearchArea", Danel.SmartSearchControl).slideUp(600, function() { jQuery(".ResultsArea", Danel.SmartSearchControl).slideDown(600); });
            }
            else {
                jQuery(".ResultsArea", Danel.SmartSearchControl).show(0);
            }
            jQuery(".FilterBox", Danel.SmartSearchControl).each(function() {
                this.control.bindToFilter();
                this.control.bindToData();
            });
            Danel.initNewSearchPanel();
            Danel.View = 1;
        }
        jQuery("body").addClass("CursorWait");
        Danel.getSearchData(searchRequest, Danel.onSearchResults);

    };

    Danel.onSearchResults = function(data, context) {


        /*
        if (context) {
        Danel.CacheController.addCache(jQuery.extend(true, {}, Danel.SearchRequest), jQuery.extend(true, [], data));
        }
        */


        jQuery(Danel.MainModule.searchResults.targetElement).slideUp(150, function() {
            jQuery(".JobsLabel", Danel.SmartSearchControl).css({ "visibility": "visible" }).
           find(".BigText").text(data.length);
            Danel.SearchResults.data.setValue(data);
            jQuery("body").removeClass("CursorWait");
            jQuery(this).slideDown(300, function() {
                //jQuery(this).css({"display":"table"});
            });
        });
    };

    Danel.getDataBinds = function(object, key) {
        var arr = [];
        for (var bind in Danel.DataBinds) {
            var obj = Danel.DataBinds[bind];
            if (obj.dataitem === object || obj.control === object && (key === null || key === undefined || key == obj.key)) {
                arr.push(obj);
            }
        }
        return arr;
    };

    Danel.checkBind = function(bind) {
        var binds = Danel.getDataBinds(bind.control);
        for (var i = 0; i < binds.length; i++) {
            if (binds[i].dataitem === bind.dataitem && binds[i].key == bind.key) { return true; }
        }
        return false;
    };

    Danel.addDataBind = function(dataitem, control, key) {
        var bind = { dataitem: dataitem, control: control, key: key || "" };
        if (!Danel.checkBind(bind)) {
            Danel.DataBinds.addItem(bind);
        }
    };

    Danel.removeDataBind = function(bind) {
        Danel.DataBinds.deleteItem(bind);
        var c = Danel.getDataBinds(bind.dataitem).length;
        if (c === 0 && bind.dataitem.dispose) {
            bind.dataitem.dispose();
        }
        //if (bDelete) 
    };




    Danel.SearchRequest = {};

    Danel.SearchRequest.WildCards = new Danel.BasicList();

    Danel.SearchRequest.WildCard = function(value) {
        this.value = value;
    };

    Danel.SearchRequest.WildCard.prototype = jQuery.extend(new Danel.DataItem(),
        {
            dispose: function() {
                Danel.SearchRequest.WildCards.deleteItem(this);
            }
        });

    Danel.SearchRequest.Filter = function() { };

    Danel.SearchRequest.prototype = Danel.DataItem;


    Danel.SearchRequest.Filter.prototype = jQuery.extend(new Danel.DataItem(),
        {
            dispose: function() {
                Danel.SearchRequest.Filters[this.value.item.fieldInfo.name].setValue();
            },
            isEmpty: function() {
                return !(this.value && this.value.value && this.value.value != "");
            }
        });

    Danel.SearchRequest.Filters = {
        "Fields": new Danel.SearchRequest.Filter(),
        "Professions": new Danel.SearchRequest.Filter(),
        "Areas": new Danel.SearchRequest.Filter(),
        "Populations": new Danel.SearchRequest.Filter(),
        "Scopes": new Danel.SearchRequest.Filter()

    };




    Danel.Dictionaries = {};
    Danel.Dictionaries.getFilteredDictionary = function(field, callback, context) {

        function filterData(data) {
            var obj = {};
            var dic = Danel.getDictionary(field);
            //if (data.lentgh==0) Danel.getDictionary(field);
            var l = dic.getLength();
            var c;
            for (var i = 0; i < data.length; i++) {
                var row = data[i];
                var values = row[field].split(",");
                c++;
                for (var j = 0; j < values.length; j++) {
                    if (!obj[values[j]]) {
                        var d = dic.getValue(values[j]);
                        if (d != "") {
                            obj[values[j]] = {
                                value: dic.getValue(values[j]),
                                item:
                                {
                                    Count: 1
                                }
                            };
                        }
                    }
                    else {
                        obj[values[j]].item.Count++;
                    }
                }
            }
            if (c === 0) { obj = Danel.getDictionary(field); }
            callback.call(context, jQuery.extend(obj, new Danel.Dictionaries.BaseDictionary()));
            return obj;
        }
        var ignoreprof = (field == "Fields");

        var filter = Danel.SearchRequest.Filters[field];
        if (filter.value && filter.value.value && filter.value.value != "") {
            var sr2 = jQuery.extend(true, {}, Danel.SearchRequest);
            sr2.Filters[field].setValue({ "item": "", "text": "", "value": "" });
            if (ignoreprof) { sr2.Filters.Professions.setValue({ "item": "", "text": "", "value": "" }); }
            var flag = false;
            for (var x in sr2.Filters) {
                if (!sr2.Filters[x].isEmpty()) {
                    flag = true;
                    break;
                }
            }
            if (flag) {
                Danel.getSearchData(sr2, filterData);
                /*
                if (!Danel.CacheController.checkCache(sr2)) {
                var url = Danel.AjaxUrl + "GetSearchResults.ashx";
                var args = { searchParams: [] };
                for (var key in sr2.Filters) {
                if (!sr2.Filters[key].value || sr2.Filters[key].value == "") continue;
                args.searchParams.push({ name: key, value: sr2.Filters[key].value.value });
                };
                args.searchParams = JSON.stringify(args.searchParams);
                jQuery.ajax({ url: url, dataType: "json", data: args, success: filterData });
                }
                else {
                filterData(Danel.CacheController.getCache(sr2));
                }
                */
            }
            else {
                callback.call(context, Danel.getDictionary(field));
                return Danel.getDictionary(field);
            }
        }
        else {
            filterData(Danel.SearchResults.data.getValue());
        }

    };
    Danel.Dictionaries.BaseDictionary = function() { };
    Danel.Dictionaries.BaseDictionary.prototype.getValue = function(key) {
        return (this[key]) ? this[key].value : "";
    };
    Danel.Dictionaries.BaseDictionary.prototype.getLength = function() {
        var c = 0;
        for (var key in this) {
            if (typeof (this[key]) == "function") { continue; }
            c++;
        }
        return c;
    };

    Danel.getDictionary = function(name) {

        var dic = Danel.Dictionaries[name + "Dictionary"];

        return dic;
    };


    Danel.Controls.Control = function() { };
    Danel.Controls.Control = jQuery.extend(Danel.Controls.Control,
        {
            Create: function(elem) {
                var o = new this();
                o.targetElement = elem;
                elem.control = o;
                o.config = {};
                o.loadConfig();
                o.binds = new Danel.BasicList();
                o.init();
                o.initToolTip();
                return o;
            }
        });


    //Base Control
    Danel.Controls.Control.prototype =
        {
            init: function() {

            },

            initToolTip: function() {
                if (this.config.tooltip) {
                    jQuery(this.targetElement).qtip(jQuery.extend({
                        "content": this.config.tooltip
                    }, tipStyle));
                }
            },

            trigger: function() {
                jQuery(this.targetElement).trigger.apply(jQuery(this.targetElement), arguments);
            },

            bind: function() {
                jQuery(this.targetElement).bind.apply(jQuery(this.targetElement), arguments);
            },

            ajaxCommand: function(name, args, handler, context) {
                var response = {};
                response.caller = this;
                response.handler = handler || this.onAjaxResponse;
                response.context = context || null;
                var url = Danel.AjaxUrl + name + ".ashx";
                jQuery.ajax({ url: url, dataType: "text", data: args, success: this.processAjaxResponse, context: response });
            },

            processAjaxResponse: function(data) {
                //data = JSON.parse(data.replace("\\/Date\((\d+)\)\\/", "new Date($1)"));
                data = Sys.Serialization.JavaScriptSerializer.deserialize(data);
                this.context.handler.call(this.context.caller, data, this.context.context, this);
            },

            onAjaxResponse: function(data) {
            },

            loadConfig: function() {
                var str = this.targetElement.getAttribute("config");
                if (str !== null) {
                    this.config = JSON.parse(str);
                }

            },

            onDataChanged: function(value, key) {
                var binds = Danel.getDataBinds(this);
                for (var i = 0; i < binds.length; i++) {
                    if (((key === undefined || key === null) && binds[i].key == "") || binds[i].key == key) {
                        binds[i].dataitem.setValue(value, this);
                    }
                }
            },

            clearBinds: function() {
                var binds = Danel.getDataBinds(this);
                for (var i = 0; i < binds.length; i++) {
                    Danel.removeDataBind(binds[i]);
                }
            },

            formatData: function() {
                return Danel.DataFormatter.formatData.apply(this, arguments);
            },


            textField: "Name",
            valueField: "Id",
            value: null
        };

    Danel.DataFormatter = {

        globals: {},

        formatData: function(data, format, splitsep) {

            var formatSegement = function(segment, type) {
                var str = segment[0];
                var args, fieldname;
                switch (type) {
                    case "format":
                        var flag = true;
                        while (flag) {
                            flag = false;
                            for (var t in tokens) {
                                var token = tokens[t];
                                var match = str.match(token);
                                while (match !== null && (!match.length || match.length > 0)) {
                                    flag = true;
                                    str = str.replace(match[0], formatSegement(match, t));
                                    match = str.match(token);
                                }
                            }
                        }
                        break;
                    case "exists":
                        args = segment[1].split(",");
                        fieldname = args[0];
                        if (data[fieldname]) {
                            str = formatSegement([args[1]], "format");
                        }
                        else {
                            if (args[2]) {
                                str = formatSegement([args[2]], "format");
                            }
                        }
                        break;
                    case "lookup":
                        args = segment[1].split(",");
                        var dic = Danel.Dictionaries[args[1] + "Dictionary"];
                        if (args[0].substr(0, 2) == "^A") {
                            var fstr = "";
                            var cstr = formatSegement(["", args[0].substr(2)], "field");
                            if (cstr == "") { return cstr; }
                            cstr = cstr.split(",");
                            for (var i = 0; i < cstr.length; i++) {
                                if (i > 0) { fstr += ", "; }
                                fstr += dic.getValue(cstr[i], "field");
                            }
                            return fstr;
                        }
                        if (dic === null || dic === undefined) { throw "invalid dictionary"; }
                        return dic.getValue(formatSegement(["", args[0]], "field"));
                    case "field":
                        fieldname = segment[1];
                        if (fieldname == "_self") { return data; }
                        if (data[fieldname] == "") { return ""; }
                        if (!data[fieldname]) { return ""; }
                        if ((data[fieldname]).toUpperCase) {
                            return data[fieldname].replace(/\n/g, "<br/>");
                        }
                        else {
                            if (data[fieldname].getDate) {
                                return data[fieldname].getDate().toString() + "/" + (data[fieldname].getMonth() + 1).toString() + "/" + (data[fieldname].getFullYear()).toString();

                                //return (data[fieldname]).toLocaleString();
                            }
                            return (data[fieldname]).toString();
                        }
                        break;
                    case "class":
                        args = segment[1].split(",");
                        return ("<span class=\"" + args[1] + "\" >" + args[0] + "</span>");
                }
                for (var c in escapedchars) {
                    str = str.replace(c, escapedchars[c]);
                }
                return str;
            };

            var escapedchars =
                {
                    "&po;": "(",
                    "&pc;": ")",
                    "&co;": ","
                };

            var tokens =
                {
                    "exists": /\?\(([^()]+?,[^()]+?)\)/,
                    "lookup": /\$\(([^()]+?,[^()]+?)\)/,
                    "field": /\[([^()]+?)\]/,
                    "class": /#\(([^()]+?,[^()]+?)\)/
                };

            //var data = jQuery.extend(data,this.globals);
            var vals = splitsep ? data.split(splitsep) : [data];
            var newstr = "";
            for (var i = 0; i < vals.length; i++) {
                if (i > 0) { newstr += splitsep + " "; }
                if (vals[i] == "") { continue; }
                newstr += (splitsep) ? this.formatData(vals[i], format) : formatSegement([format], "format");
            }
            return newstr;


        }
    };
    //Search Results 
    Danel.Controls.SearchResults = jQuery.extend(function() {
        jQuery.extend(this, {
            init: function() {
                this.oTable = {};

                this.Fields = this.config.fields || [{ name: "PositionNumber", caption: "מספר משרה", width: "108px", type: "numeric", format: "<a href='#'>[_self]</a>" }, { name: "Title", caption: "שם משרה", width: "216px", type: "string" }, { name: "Areas", caption: "אזורים", isArray: true, format: "$(_self,Areas)", width: "216px", searchable: "false", sortable: "false" },
                    { name: "Text", caption: "תיאור משרה", hidden: true }, { name: "Populations", caption: "קטגוריה", isArray: true, format: "$(_self,Populations)", hidden: true}];
                var columns = [];

                columns.push({
                    sTitle: "data",
                    bUseRendered: false,
                    bVisible: false
                });
                var colFormat_FnRender = function(row) {
                    var fieldInfo = p.Fields[row.iDataColumn - 1];
                    return (fieldInfo.format) ?
                      p.formatData(row.aData[row.iDataColumn], fieldInfo.format, (fieldInfo.isArray) ? "," : null)
                      : row.aData[row.iDataColumn];
                };
                for (var i = 0; i < this.Fields.length; i++) {
                    var p = this;
                    columns.push({
                        "bVisible": !p.Fields[i].hidden,
                        "bUseRendered": !!(p.Fields[i].format),
                        "sTitle": p.Fields[i].caption,
                        "sWidth": p.Fields[i].width || "auto",
                        "bSearchable": p.Fields[i].searchable || true,
                        "bSortable": p.Fields[i].sortable || true,
                        "sType": p.Fields[i].type || "auto",
                        "fnRender": (!!(p.Fields[i].format)) ? colFormat_FnRender : null
                    });
                }
                var data = [];
                var canDataAnchor = "<a href='" + _baseurl + "JobSearch/SendCV.aspx" + "' class='CommandButton' >להירשם למאגר מחפשי עבודה</a>";
                this.oTable = jQuery(this.targetElement).empty().dataTable({
                    "bAutoWidth": false,
                    "bProcessing": false,
                    "aaData": data,
                    "aoColumns": columns,
                    "bSort": false,
                    "bLengthChange": false,
                    "oLanguage": {
                        "sZeroRecords": "לא נמצאו משרות עבור חיפושך, באפשרותך " + canDataAnchor

                    }
                    /*"aaSorting": [[5, 'desc'], [6, 'desc']]*/
                });
                jQuery(".ToolBox_Wrapper").prependTo(this.oTable.parent()).css({ "display": "block" });

                Danel.addDataBind(Danel.SearchResults.data, this);


            },

            bindCellEvents: function() {
                var oTable = this.oTable;
                var _self = this;
                var _sendCV = function() {

                };
                var randomnumber = Math.floor(Math.random() * 10001);
                var asyncArr = jQuery(oTable.fnGetNodes()).css({ "cursor": "pointer" });

                var fancyfunc = function() {

                    var index = oTable.fnGetPosition(this);
                    var data = oTable.fnGetData(index);
                    var dataobj = data[0];

                    if (dataobj.IsHot) {
                        jQuery(this).css({ "font-weight": "bold", "color": "#FF0000" });
                    }
                    dataobj.Url = _baseurl + "JobSearch/" + dataobj.PositionNumber + "-JobInfo.aspx";
                    jQuery(this).find("td:first-child a").each(function() {

                        jQuery(this).attr("rel", "JobDetails" + randomnumber.toString()).fancybox(
                           {
                               'transitionIn': 'elastic',
                               'transitionOut': 'elastic',
                               'easingIn': 'easeOutBack',
                               'easingOut': 'easeInBack',
                               'speedIn': 350,
                               'speedOut': 350,
                               'cyclic': true,
                               'autoscale': false,
                               'centerOnScroll': true,
                               'autoDimensions': false,
                               'hideOnOverlayClick': true,
                               'showNavArrows': true,
                               'width': 550,
                               'height': 500,
                               'onClosed': function() { Danel.CurrentPosition = null; },
                               'content': jQuery("<p/>").html(
                         Danel.DataFormatter.formatData(dataobj, Danel.TemplateController.getTemplate("JobDetails"))),
                               'onCleanup': function() {

                                   jQuery(Danel.getCVFrameWrapper()).hide(0);

                                   jQuery(".JobDetails .JobInfoWrap").css({ 'overflow': 'auto', 'marginRight': 0 });
                                   if (jQuery(".JobDetails .SendCVForm").length == 1) {
                                       jQuery(".JobDetails .SendCVForm").get(0).state = 0;
                                       jQuery(".JobDetails .SendCVForm").removeClass("SendCVForm").addClass("SendCV");
                                   }
                                   jQuery(".JobDetails .SendCV").show(0);

                                   //jQuery(".JobDetails .SendCV").get(0).switchState(1);

                               },
                               'onStart': function() {
                                   Danel.CurrentPosition = dataobj.Id;
                                   var wrap = jQuery(this);
                                   var frame = Danel.getCVFrameWrapper();
                                   jQuery(frame.IFrame).css({ 'marginRight': 580 });
                                   //
                               },

                               'onResize': function() {

                                   var frame = Danel.getCVFrameWrapper(true);
                                   var position = jQuery(".JobInfoWrap").offset();
                                   var scrolltop = jQuery(document).scrollTop();
                                   jQuery(frame).css({ "top": position.top - scrolltop, "left": position.left + 20 });
                                   if (jQuery(".JobDetails .SendCV").length === 0) {
                                       jQuery(frame).css({ "left": position.left - 560 });
                                   }

                               },

                               'onComplete': function() {

                                   var p = this;
                                   var frame = Danel.getCVFrameWrapper();

                                   var scrolltop = jQuery(document).scrollTop();

                                   var ico = jQuery("#fancybox-left-label").add("#fancybox-right-label");
                                   if (ico.length == 0) {
                                       var obj = jQuery("<div/>").attr("Id", "fancybox-left-label").css({ position: "absolute", top: "50%" }).text('משרה קודמת').insertAfter("#fancybox-left-ico").addClass("FancyNavLabel").click(function() { jQuery("#fancybox-left-ico").click(); });
                                       obj.css({ left: (-5 - obj.outerWidth() / 2) });
                                       obj = jQuery("<div/>").attr("Id", "fancybox-right-label").css({ position: "absolute", top: "50%" }).text('משרה הבאה').insertAfter("#fancybox-right-ico").addClass("FancyNavLabel").click(function() { jQuery("#fancybox-right-ico").click(); });
                                       obj.css({ right: (-5 - obj.outerWidth() / 2) });
                                   }
                                   else {
                                       jQuery(ico.get(0)).css({ visibility: "visible", left: "-26.5px" });
                                       jQuery(ico.get(1)).css({ visibility: "visible", right: "-26.5px" });
                                   }
                                   var position = jQuery(".JobInfoWrap").offset();
                                   jQuery(frame).css({ "top": position.top - scrolltop, "left": position.left + 20 });
                                   jQuery(".JobDetails .SendCV").click(function() {
                                       if (!this.state) { this.state = 0; }
                                       var button = this;
                                       var frame = Danel.getCVFrameWrapper(true);
                                       var wrap = jQuery(this);
                                       if (this.state === 0) {
                                           frame.checkReload();
                                           jQuery(frame).css({ "visibility": "visible" }).show(0);
                                           jQuery(frame).css({ "left": position.left + 20 }).show(0);
                                           jQuery(frame.IFrame).animate({ 'marginRight': 0 }, 500);
                                           jQuery(".JobDetails .JobInfoWrap").css({ "overflow": "hidden" }).animate({ 'marginRight': -580 }, 500);
                                           jQuery(".FancyNavLabel").css({ "visibility": "hidden" });
                                           wrap.addClass("SendCVForm").removeClass("SendCV");
                                           if (frame.IsActive) {
                                               jQuery(frame.PositionInput).val(Danel.CurrentPosition);
                                           }
                                           else {
                                               jQuery(frame).bind("Active", function() {
                                                   jQuery(frame.PositionInput).val(Danel.CurrentPosition);
                                               });
                                           }
                                           this.state = 1;

                                       }
                                       else {
                                           if (frame.IsActive) {
                                               jQuery(frame.getSendButton()).click();
                                           }
                                           else {
                                               jQuery(frame).bind("Active", function() {
                                                   jQuery(frame.getSendButton()).click();
                                               });
                                           }
                                           frame.interact();
                                       }
                                   });
                               }
                           });
                    });
                    var dataelem = jQuery(this).find("td:first-child a");
                    jQuery(this).click(function() {
                        dataelem.click();
                    }).qtip({
                        "content": ((dataobj.IsHot) ? "<div class='RedLabel'>משרה חמה</div>" : "") + dataobj.Text || "",
                        "position":
                            {
                                "target": "mouse"
                            },
                        "style":
                            {
                                "textAlign": "right"
                            },
                        "show":
                            {
                                solo: true
                            }
                    });
                };

                var ifancy = 0;
                var finterval = setInterval(function() {
                    if (!asyncArr[ifancy]) {
                        clearInterval(finterval);
                    }
                    else {
                        fancyfunc.call(asyncArr[ifancy]);
                        ifancy++;
                    }
                }, 1);
            },

            addDataAsync: function(data, count, scope) {
                var self = this;
                if (scope !== self.scope) { return; }
                var oTable = this.oTable;
                if (count > data.length) { count = data.length; }
                var arr = Array.prototype.splice.call(data, 0, count);
                oTable.fnAddData(arr, (((Danel.SearchResults.data.getValue().length - data.length) % 50 === 0)));
                /*this.bindCellEvents();*/
                if (count != data.length) {
                    setTimeout(function() {
                        self.addDataAsync.call(self, data, count, scope);
                    }, 0);
                }
                else {
                    this.bLoading = false;
                    jQuery("body").removeClass("CursorWait");
                    jQuery(".AjaxLoader").css({ 'visibility': 'hidden' });
                    this.oTable.fnDraw();
                    this.bindCellEvents();
                    //this.markHotPositons();
                }

            },

            dataBind: function(data) {
                this.oTable.fnClearTable();
                var arr = [];
                for (var i = 0; i < data.length; i++) {
                    var arr2 = [data[i]];
                    for (var j = 0; j < this.Fields.length; j++) {
                        arr2.push(data[i][this.Fields[j].name]);
                    }
                    arr.push(arr2);
                }
                this.scope = {};
                this.bLoading = true;
                jQuery("body").addClass("CursorWait");
                jQuery(".AjaxLoader").css({ 'visibility': 'visible' });
                this.addDataAsync(arr, 10, this.scope, true);
            }

        });
    }, Danel.Controls.Control);
    Danel.Controls.SearchResults.prototype = new Danel.Controls.Control();

    Danel.Controls.FieldDropList = jQuery.extend(function() {
        jQuery.extend(this, {
            init: function() {
                this.loadItems();
            },

            loadItems: function() {
                var dic = Danel.getDictionary(this.config.field);
                var elem = jQuery(this.targetElement).empty();
                if (this.config.bEmptyItem) {
                    var emptyText = this.config.emptyText || "בחר";
                    jQuery("<option/>").text(emptyText).val("-1").appendTo(elem);
                }
                for (var x in dic) {
                    if (typeof dic[x] != "object") { continue; }
                    jQuery("<option/>").text(dic.getValue(x)).val(x).appendTo(elem);
                }
            }
        });

    }, Danel.Controls.Control);
    Danel.Controls.FieldDropList.prototype = new Danel.Controls.Control();



    //SearchBox Control
    Danel.Controls.SearchBox = jQuery.extend(function() {
        jQuery.extend(this, {
            //fieldName: "",
            bAutoComplete: false,
            bAutoBound: true,
            bFreeTextData: false,
            sEmptyText: "",

            addAutocompleteData: function(data, context) {
                var arr = [];
                for (var x in data) {
                    if (typeof data[x] != "object") { continue; }
                    data[x].fieldInfo = context;
                    var field = context.textField || this.textField;
                    var o = SplitGenderString(data[x].item[field]);
                    if (o != null) {
                        var d2 = jQuery.extend(true, {}, data[x]);
                        d2.item[field] = o.female;
                        data[x].item[field] = o.male;
                        arr.push(d2);
                    }
                    arr.push(data[x]);
                }
                this.alldata[context.name] = arr;
                if (!this.bAutoComplete) {
                    this.initAutocomplete();
                }
                else {
                    this.refreshAutocompleteData();
                }
            },

            refreshAutocompleteData: function() {
                jQuery(this.targetElement).setOptions({ data: this.alldata.getData() });
            },

            initAutocomplete: function() {
                var p = this;
                jQuery(this.targetElement).autocomplete(this.alldata.getData(), {
                    formatItem: function(row) {
                        var field = row.fieldInfo.textField || p.textField;
                        var format = row.fieldInfo.formatView;
                        if (format) {
                            return p.formatData(row.item, row.fieldInfo.formatView);
                        }
                        else {
                            return row.item[field];
                        }
                    },
                    formatMatch: function(row) {
                        var field = row.fieldInfo.textField || p.textField;
                        return row.item[field];
                    },
                    max: 50,
                    matchContains: true
                });

                this.bAutoComplete = true;
            },

            init: function() {
                this.alldata = {
                    getData: function() {
                        var dataArray = [];
                        for (var arr in this) {
                            if (typeof this[arr] != "object" || !this[arr].concat) { continue; }
                            dataArray = dataArray.concat(this[arr]);
                        }
                        return dataArray.sort();
                    }
                };


                for (var i = 0; i < this.config.fields.length; i++) {
                    var field = this.config.fields[i];
                    var args = { field: field.name, filter: field.filter };
                    //this.ajaxCommand("GetFieldData",args,  this.addAutocompleteData,field);
                    this.addAutocompleteData(Danel.getDictionary(field.name), field);
                }
                //this.fieldName=this.config.fields;
                this.sEmptyText = this.config.emptyText || this.targetElement.value || "";
                jQuery(this.targetElement).blur(this.blur);
                this.targetElement.blur();
                this.targetElement.style.color = "#8F8F8F";

                //jQuery.ajax({url:"DanelSearchHandler.ashx",dataType:"json",data:data,success:this.initAutocomplete,context:this});
                jQuery(this.targetElement).focus(this.focus);
                this.bind("result", this.result);
                this.bind("keydown", function() {

                }
                   );
                this.bind("keyup", this.ontextchange);
            },

            blur: function() {
                if (this.value == "") {
                    this.value = this.control.sEmptyText || "";
                    this.style.color = "#8F8F8F";
                }
            },

            result: function(data, item) {
                this.control.clearBinds(true);
                this.control.bFreeTextData = false;
                Danel.SearchRequest.Filters[item.fieldInfo.name] = Danel.SearchRequest.Filters[item.fieldInfo.name] || new Danel.SearchRequest.Filter({ value: item.key, text: item.value, item: item });
                var text;
                if (item.fieldInfo.name == "Professions") {
                    Danel.addDataBind(Danel.SearchRequest.Filters.Fields, this.control, "secondaryF");
                    text = Danel.getDictionary("Fields").getValue(item.item.FieldId);
                    this.control.onDataChanged({ value: item.item.FieldId, text: text, item: { fieldInfo: { name: "Fields" }, key: item.item.fieldid, value: text} }, "secondaryF");
                }
                if (item.fieldInfo.name == "Cities") {
                    Danel.addDataBind(Danel.SearchRequest.Filters.Areas, this.control, "secondaryA");
                    text = Danel.getDictionary("Areas").getValue(item.item.AreaId);
                    this.control.onDataChanged({ value: item.item.AreaId, text: text, item: { fieldInfo: { name: "Areas" }, key: item.item.areaid, value: text} }, "secondaryA");
                }
                var inputlist = jQuery("input:visible");
                var index = inputlist.index(this);
                inputlist[index + 1].focus();
                inputlist[index + 1].select();
                inputlist[index + 1].setAttribute("autofocus", "true");
                jQuery(inputlist[index + 1]).bind("blur", function() { this.removeAttribute("autofocus"); }).bind("keyup", function() { this.removeAttribute("autofocus"); });
                Danel.addDataBind(Danel.SearchRequest.Filters[item.fieldInfo.name], this.control);
                this.control.onDataChanged({ value: item.key, text: item.value, item: item });
            },

            onchange: function() {

            },

            ontextchange: function(event) {

                if (event.keyCode == 13) { return; }
                if (!this.control.bFreeTextData) {
                    this.control.clearBinds();
                    var wild = new Danel.SearchRequest.WildCard({ value: this.value, text: this.value, item: this.value });
                    Danel.SearchRequest.WildCards.addItem(wild);
                    Danel.addDataBind(wild, this.control);
                    this.control.bFreeTextData = true;
                }
                this.control.onDataChanged({ value: this.value, text: this.value, item: this.value });
            },

            focus: function() {
                this.style.color = "";
                if (this.value == this.control.sEmptyText && !this.getAttribute("autofocus")) {
                    this.value = "";
                }
            }
        });
    }, Danel.Controls.Control);
    Danel.Controls.SearchBox.prototype = new Danel.Controls.Control();
    //End SearchBox Control

    //CommandButton Control
    Danel.Controls.CommandButton = jQuery.extend(function() {
        jQuery.extend(this, {
            init: function() {
                var p = this;
                jQuery(this.targetElement).click(function() {
                    Danel.CommandsHandler.runCommand(p.config.command, (p.config.args || {}), p);
                });
            }
        });
    }, Danel.Controls.Control);

    Danel.CommandsHandler = {
        runCommand: function(command, args, sender) {
            switch (command) {
                case "getResults":
                    var req = true;
                    var inputs = jQuery(".SearchBox:visible").each(function() {
                        if (this.control.config && this.control.config.required && (this.value.length < 3 || this.value == "" || this.value == this.control.sEmptyText)) {
                            req = false;
                            return;
                        }
                        var fArray = [];
                        if (this.control.bFreeTextData) {
                            jQuery.each(this.control.config.fields, function() {
                                fArray.push(this.name);
                            });
                            Danel.WildCardController.parseWildCard(this.value, fArray);
                        }
                    });

                    if (!req) { return; }
                    Danel.requestSearchResults();
                    break;
            }
            document.location.hash = command;
        }
    };

    Danel.Controls.CommandButton.prototype = new Danel.Controls.Control();

    Danel.Controls.FilterBox = jQuery.extend(function() {
        jQuery.extend(this,
            {
                filterOptions: function(dic) {
                    this.addOptions(dic, true);
                },

                addOptions: function(dic, repop) {

                    var p = this;

                    var selectedValues = (Danel.SearchRequest.Filters[this.config.field.name] && !Danel.SearchRequest.Filters[this.config.field.name].isEmpty()) ?
                     Danel.SearchRequest.Filters[this.config.field.name].getValue().value.split(",") : [];

                    for (var x = 0; x < selectedValues.length; x++) {
                        if (!dic[selectedValues[x]]) {
                            dic[selectedValues[x]] = Danel.getDictionary(this.config.field.name)[selectedValues[x]];
                        }
                    }
                    jQuery(this.targetElement).empty();
                    var sortedDic = [];
                    for (var item in dic) {
                        if (typeof dic[item] == "function") { continue; }
                        sortedDic.push({ "value": item, "name": dic[item].value, "count": dic[item].item.Count });
                    }

                    Array.prototype.sort.call(sortedDic, function(a, b) {
                        return (a.name > b.name) ? 1 : -1;
                    });
                    this.currentDictionary = dic;
                    for (var i = 0; i < sortedDic.length; i++) {
                        var dicItem = sortedDic[i];
                        var elem = jQuery("<option/>").val(dicItem.value).text(dicItem.name + " (" + dicItem.count + ")").appendTo(this.targetElement);
                        if (jQuery.inArray(dicItem.value, selectedValues) != -1) {
                            elem.attr("selected", "selected");
                        }
                        //this.controls.push(elem);
                    }
                    if (!repop) {
                        this.createList();
                    }
                    else {
                        //this.bTrigger = true;
                        jQuery(this.targetElement).trigger("datachange");
                    }
                    jQuery(this).dropdownchecklist("enable");
                },

                createList: function() {
                    var p = this;
                    var dic = this.currentDictionary;
                    jQuery(this.targetElement).dropdownchecklist({ width: this.config.width || "200px", maxDropHeight: 150, emptyText: this.config.text || "לחצ/י לבחירה",
                        textFormatFunction: function(options) {
                            var selectedOptions = options.filter(":selected");
                            var countOfSelected = selectedOptions.size();
                            var size = options.size();
                            switch (countOfSelected) {
                                case 0: return p.config.text;
                                case 1: return selectedOptions.text();
                                case size: return p.config.text;
                                default: return countOfSelected + " " + (p.config.tname || "אאא");
                            }
                        }
                    }).change(function() {
                        this.control.bChange = true;
                        if (!this.control.bTrigger) {

                            var p = this;
                            var values = jQuery(p).val();
                            var dic = this.control.currentDictionary;
                            if (values === null) {
                                this.control.onDataChanged({ "text": "", "value": "", "item": {} }, "BindData");
                                //Danel.requestSearchResults();
                                return;
                            }
                            var item = jQuery.map(values, function(item) {
                                return { "text": dic.getValue(item), "value": item };
                            });
                            var text = jQuery.map(values, function(item) {
                                return dic.getValue(item);
                            }).toString();

                            var value = values.toString();
                            this.control.onDataChanged({ "text": text, "value": value, "item": item }, "BindData");

                        }
                        this.control.bTrigger = false;
                    }).blur(function() {
                        //alert("abc");
                        if (this.control.bChange) { Danel.requestSearchResults(); }
                        this.control.bChange = false;
                    }).focus(function() {
                        //this.control.bChange = true;
                    });
                    this.initToolTip(jQuery(this.targetElement).parent());

                },

                init: function() {
                    this.bTrigger = false;
                    this.bChange = false;

                    var dic = Danel.getDictionary(this.config.field.name);

                    this.addOptions({});

                },

                initToolTip: function(obj) {
                    if (obj === undefined || !this.config.tooltip) { return; }
                    obj.qtip(jQuery.extend({ "content": this.config.tooltip }, tipStyle));
                },

                bindToFilter: function() {
                    Danel.addDataBind(Danel.SearchRequest.Filters[this.config.field.name], this, "BindData");
                    this.dataBind(null, "BindData");
                },

                bindToData: function() {
                    Danel.addDataBind(Danel.SearchResults.data, this, "FilterDictionary");
                },


                dataBind: function(item, key) {
                    switch (key) {
                        case "BindData":
                            if (item === undefined || item === null) {
                                item = Danel.getDataBinds(this, key)[0].dataitem.getValue();
                                if (item === undefined || item === null || item.value == "") { return; }
                            }
                            jQuery(this.targetElement).val(item.value);
                            this.bTrigger = true;
                            jQuery(this.targetElement).change();
                            break;

                        case "FilterDictionary":
                            var self = this;
                            setTimeout(function() {
                                Danel.Dictionaries.getFilteredDictionary(self.config.field.name, self.filterOptions, self);
                            }, 0);
                            break;
                    }

                }

            });
    }, Danel.Controls.Control);
    Danel.Controls.FilterBox.prototype = new Danel.Controls.Control();

    //Smart Search Control
    Danel.Controls.SmartSearch = jQuery.extend(function() {
        jQuery.extend(this, {
            visibleControls: 0,
            init: function() {
                Danel.SmartSearchControl = this.targetElement;
                this.searchControls = [];
                var p = this;
                jQuery(".ResultsArea").hide();
                jQuery(".AjaxLoader").ajaxStart(function() {
                    jQuery(this).css({ 'visibility': 'visible' });
                }).ajaxStop(function() { jQuery(this).css({ 'visibility': 'hidden' }); });

                jQuery(".SearchBox", this.targetElement).each(function() {
                    var search = Danel.Controls.SearchBox.Create(this);
                    //if (s.length>0) search.targetElement.style.display="none";
                    p.searchControls.push(search);
                });

                jQuery(".SearchResults", this.targetElement).each(function() {
                    p.searchResults = Danel.Controls.SearchResults.Create(this);
                });

                jQuery(".CommandButton", this.targetElement).each(function() {
                    Danel.Controls.CommandButton.Create(this);
                });

                jQuery(".FilterBox", this.targetElement).each(function() {
                    Danel.Controls.FilterBox.Create(this);
                });

                jQuery(".FieldDropList", this.targetElement).each(function() {
                    Danel.Controls.FieldDropList.Create(this);
                });

            }
        });
    }, Danel.Controls.Control);
    Danel.Controls.SmartSearch.prototype = new Danel.Controls.Control();


    //Initialize DanelModule
    var init = function() {


        var url = Danel.AjaxUrl + "GetDictionary" + ".ashx";
        var dics = ["Fields", "Areas", "Professions", "Populations", "Scopes", "Cities"];
        jQuery.each(dics, function() {
            var args = { "dicname": this };
            requests.push(true);
            jQuery.ajax({ url: url, dataType: "json", data: args, success: initDictionary, context: this });
        });
        Danel.TemplateController.loadTemplate("JobDetails");

    };


    var initDictionary = function(data) {

        var dic = Danel.Dictionaries[this.context + "Dictionary"] = new Danel.Dictionaries.BaseDictionary();

        for (var i = 0; i < data.Data.length; i++) {
            dic[data.Data[i][data.Key]] = { "key": data.Data[i][data.Key], "value": data.Data[i][data.Value], "item": data.Data[i] };
        }
        requests.pop();

        checkLoad();
    };

    var initControls = function() {

        Danel.MainModule = Danel.Controls.SmartSearch.Create(jQuery(".DanelModule").get(0));
        initFieldSearchBox();

    };

    var initFieldSearchBox = function() {
        var obj = jQuery("<div/>").addClass("FieldScreen");
        var fieldDic = Danel.getDictionary("Fields");
        jQuery("<div/>").addClass("FieldScreenLabel").text("בחר תחום עיסוק").appendTo(obj);
        for (var x in Danel.getDictionary("Fields")) {
            if (!fieldDic[x].item) { continue; }
            var t = jQuery("<a/>").attr("value", x).attr("ref", "#").html(fieldDic.getValue(x) + " (<span class='FieldCount'>" + fieldDic[x].item.Count + "</span>)").appendTo(obj);
        }
        obj = jQuery("<div/>").append(obj);
        var fancy = jQuery(".DanelModule .FieldSearch").fancybox(
                {
                    'transitionIn': 'elastic',
                    'transitionOut': 'elastic',
                    'easingIn': 'easeOutBack',
                    'easingOut': 'easeInBack',
                    'speedIn': 350,
                    'speedOut': 350,
                    'width': 600,
                    'autoDimensions': false,
                    'content': obj.html()
                }
           ).click(function() {
               jQuery(".FieldScreen a").click(function() {
                   jQuery.fancybox.close();
                   Danel.SearchRequest.Filters.Fields.setValue({ "text": jQuery(this).text, "value": jQuery(this).attr("value"), item: {} });
                   Danel.requestSearchResults();
               });
           });


    };

    Danel.Config = Config;

    jQuery.fn.dataTableExt.afnSortData['dom-checkbox'] = function(oSettings, iColumn) {
        var aData = [];
        $('td:eq(' + iColumn + ') input', oSettings.oApi._fnGetTrNodes(oSettings)).each(function() {
            aData.push(this.checked === true ? "1" : "0");
        });
        return aData;
    };


    jQuery(init);


})(t, { SmartSearchElem: "DanelModule" });
   

        