﻿(function () {

    var createInstance = function (Danel, MainElement) {
        var _controls;
        var _analytics = AnalyticsProvider.getCurrent();
        //var _baseurl = "http://" + document.location.hostname + "/DNN493/";
        var _baseurl = window.__ApplicationPath;
        var requests = [];
        Danel.checkAuthentication = function (calltrue, callfalse) {
            jQuery.get(_baseurl + "DesktopModules/DanelSearch/IsAuthenticated.ashx").done(function (data) {
                if (data.toLowerCase() == "true") {
                    calltrue();
                }
                else {
                    callfalse();
                }

            });
        }
        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: "topMiddle",
                                    tooltip: "bottomMiddle"
                                }
                            }
        };

        var checkLoad = function () {
            if (requests.length === 0) {
                initControls();
                if (Danel.UrlController.ParseURLParams()) {
                    Danel.b_customquery = true;
                }
                if (Danel.b_customquery) {
                    Danel.requestSearchResults();
                }
            }
        };

        Danel.initNewSearchPanel = function () {
            jQuery(".NewSearchPanel .FieldDropList", Danel.SmartSearchControl).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", Danel.SmartSearchControl).click(function () {

                var flag1 = true;
                jQuery(".NewSearchPanel .FieldDropList", Danel.SmartSearchControl).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", Danel.SmartSearchControl).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.SearchRequest.IsNew = true;
                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;
            }
            _CVFrameWrapper.getPositionInput = 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.PositionInput;
            }
            //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 = "\.aspx(#(f?a?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[2];
            var values = decodeURI(m[3]).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/";
            var vals = "";
            var hash = {
                "Fields": "F",
                "Professions": "P",
                "Areas": "A",
                "Populations": "C",
                "Scopes": "S"
            }
            for (var filtername in hash) {
                if (!hash.hasOwnProperty(filtername) || searchRequest.Filters[filtername].isEmpty()) { continue; }
                str += hash[filtername];
                if (vals != "") { vals += ","; }
                vals += encodeURIComponent(searchRequest.Filters[filtername].getValue().text.replace(/,/g, "+").replace(/\s/g, "_"));
            }
            return str + "-" + vals + ".aspx";
        };

        Danel.UrlController.ParseUrl = function () {
        };


        Danel.WildCardController =
       {
           getWordCombinations: function (data) {
               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, bSplit) {

               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 = (bSplit) ? [data] : 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);
                               }

                               if (dic[key].item.AreaId && Danel.getDictionary("Areas").getValue(dic[key].item.AreaId) !== null) {
                                   if (!filters.Areas) { filters.Areas = { value: "", text: "" }; }
                                   if (filters.Areas.value != "") {
                                       filters.Areas.value += ",";
                                       filters.Areas.text += ",";
                                   }
                                   filters.Areas.value += dic[key].item.AreaId;
                                   filters.Areas.text += Danel.getDictionary("Areas").getValue(dic[key].item.AreaId);
                               }
                           }
                       }
                   }
               }


               for (var x in filters) {
                   if (x == "Cities") continue;
                   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) });

                   }

               }
           }
       };

        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) {
                            if (f == "Cities") { continue; }
                            var filter = searchRequest.Filters[f];

                            if ((row[f] === null || row[f] === undefined || row[f] == "") && filter == "") { 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)") + ')');
                   var cachedata = Sys.Serialization.JavaScriptSerializer.deserialize(data);
                   data = Sys.Serialization.JavaScriptSerializer.deserialize(data);
                   Danel.CacheController.addCache(jQuery.extend(true, {}, searchRequest), cachedata);
                   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; }
            var analyticscommand = (!searchRequest.IsNew && Danel.View === 1) ? "FilterResults" : "ViewResults";
            searchRequest.IsNew = false;
            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.b_customquery) {
                    jQuery(".SearchArea", Danel.SmartSearchControl).slideUp(600, function () { jQuery(".ResultsArea", Danel.SmartSearchControl).slideDown(600); });
                    jQuery(".FieldSearchArea").hide();
                }
                else {
                    //jQuery(".ResultsArea", Danel.SmartSearchControl).css({height:jQuery(".ResultsArea", Danel.SmartSearchControl).height()+800});
                    jQuery(".ResultsArea", Danel.SmartSearchControl).show(0);


                    //jQuery(Danel.MainModule.searchResults.targetElement).hide(0);
                }
                jQuery(".FilterBox", Danel.SmartSearchControl).each(function () {
                    this.control.bindToFilter();
                    this.control.bindToData();
                });
                Danel.initNewSearchPanel();
                Danel.View = 1;
            }

            if (_analytics) {
                _analytics.trackEvent("DanelSearch", analyticscommand, { "label": Danel.SearchRequest.getFriendlyString(searchRequest) });
                if (Danel.View == 1 && !Danel.b_customquery && _analytics) {
                    if (_analytics) {
                        _analytics.trackView(Danel.UrlController.CreateUrl(searchRequest));

                    }
                }
            }
            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));
            }
            */
            var display = function () {
                jQuery(".JobsLabel", Danel.SmartSearchControl).css({ "visibility": "visible" }).
           find(".BigText").text(data.length);
                Danel.SearchResults.data.setValue(data);
                jQuery("body").removeClass("CursorWait");
                if (!Danel.b_customquery) {
                    jQuery(this).slideDown(300, function () {
                        //jQuery(this).css({"display":"table"});
                    });
                }
            };

            if (!Danel.b_customquery) {
                jQuery(Danel.MainModule.searchResults.targetElement).slideUp(150, display);
            }
            else {
                //jQuery(Danel.MainModule.searchResults.targetElement).parent().parent().show();
                display();
                Danel.b_customquery = false;
            }

        };

        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.getFriendlyString = function (searchRequest) {
            var str = "";
            str += (searchRequest.Filters.Fields && !searchRequest.Filters.Fields.isEmpty()) ?
                            searchRequest.Filters.Fields.getValue().text : "משרות";
            str += " ";
            str += (searchRequest.Filters.Professions && !searchRequest.Filters.Professions.isEmpty()) ?
                            searchRequest.Filters.Professions.getValue().text : "כל מקצוע";
            str += " ב";
            str += (searchRequest.Filters.Areas && !searchRequest.Filters.Areas.isEmpty()) ?
                            searchRequest.Filters.Areas.getValue().text : "כל הארץ";
            str += " ל";
            str += (searchRequest.Filters.Populations && !searchRequest.Filters.Populations.isEmpty()) ?
                            searchRequest.Filters.Populations.getValue().text : "כל קטגוריה";
            str += " ב";
            str += (searchRequest.Filters.Scopes && !searchRequest.Filters.Scopes.isEmpty()) ?
                            searchRequest.Filters.Scopes.getValue().text : "כל היקף משרה";
            return str;
        }

        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 = { Filters: [] };
                for (var f in Danel.SearchRequest.Filters) {
                    if (typeof Danel.SearchRequest.Filters[f] == "function") { continue; }
                    sr2.Filters[f] = new Danel.SearchRequest.Filter();
                    sr2.Filters[f].value = (Danel.SearchRequest.Filters[f].isEmpty()) ? { "item": "", "text": "", "value": ""} : { "value": Danel.SearchRequest.Filters[f].getValue().value };
                }
                sr2.Filters[field].value = { "item": "", "text": "", "value": "" };
                if (ignoreprof) {
                    sr2.Filters.Professions = ({ "item": "", "text": "", "value": "" });
                }

                //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("data-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, {

                initTable: function () {
                    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 style='font-size:16px' 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": "<span style='font-size:16px'>לא נמצאו משרות עבור חיפושך, באפשרותך " + canDataAnchor + "</span>"

                        }
                        /*"aaSorting": [[5, 'desc'], [6, 'desc']]*/
                    });
                    jQuery(".ToolBox_Wrapper", Danel.SmartSearchControl).prependTo(this.oTable.parent()).css({ "display": "block" });

                },
                init: function () {
                    //this.oTable = null;

                    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}];
                    if (Danel.SmartSearchControl.control.config.FacebookDisplay) {
                        this.Fields[0].format = "<a href='" + _baseurl + "JobSearch/[_self]-JobInfo.aspx' target='_blank'>[_self]</a>"
                    }

                    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];


                        dataobj.Url = encodeURIComponent(document.location.protocol + "//" + document.location.hostname + _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': "<p/>",
                               /*
                               '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 () {
                                   jQuery("#fancybox-inner p").html(Danel.DataFormatter.formatData(dataobj, Danel.TemplateController.getTemplate("JobDetails")));
                                   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 });

                                   if (_analytics) {
                                       _analytics.trackView(_baseurl + "JobSearch/" + dataobj.PositionNumber + "-JobInfo.aspx");
                                       _analytics.trackEvent("DanelSearch", "ViewJobInfo", { "label": dataobj.Title, value: dataobj.PositionNumber });
                                   }

                                   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) {
                                           if (_analytics) {
                                               _analytics.trackEvent("DanelSearch", "SendCVScreen", { "label": dataobj.Title, value: dataobj.PositionNumber });
                                               _analytics.trackView(_baseurl + "JobSearch/SendCV.aspx?PositionId=" + Danel.CurrentPosition);
                                           }

                                           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.getPositionInput()).val(Danel.CurrentPosition);
                                               jQuery(frame.getSendButton()).click();
                                           }
                                           else {
                                               jQuery(frame).bind("Active", function () {
                                                   jQuery(frame.getPositionInput()).val(Danel.CurrentPosition);
                                                   jQuery(frame.getSendButton()).click();
                                               });
                                           }
                                           frame.interact();
                                       }
                                   });
                               }
                           });
                        });
                    };
                    var qTipInit = function () {
                        var index = oTable.fnGetPosition(this);
                        var data = oTable.fnGetData(index);
                        var dataobj = data[0];
                        var dataelem = jQuery(this).find("td:first-child a");
                        var hrefaltr = function () {
                            window.open(this.getAttribute("href"), "_blank");
                        }
                        if (Danel.SmartSearchControl.control.config.FacebookDisplay) {
                            dataelem.bind("click", hrefaltr);
                        }
                        if (dataobj.IsHot) {
                            jQuery(this).css({ "font-weight": "bold", "color": "#FF0000" });
                        }
                        jQuery(this).click(function () {
                            dataelem.triggerHandler("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 {
                            qTipInit.call(asyncArr[ifancy]);
                            if (!Danel.SmartSearchControl.control.config.FacebookDisplay) {
                                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) {
                    if (!this.oTable) { this.initTable(); }
                    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).bind("focus click", 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.value = this.control.sEmptyText || "";
                        this.style.color = "#8F8F8F";
                    }

                },

                result: function (data, item) {
                    this.control.clearBinds(true);
                    this.control.bFreeTextData = false;
                    /*
                    if (this.control.force && item)
                    {
                    var data = this.alldata.getData();
                    
                    }
                    */
                    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 (event) {
                    this.style.color = "";
                    if (this.value == this.control.sEmptyText && (event.type == "click" || !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", Danel.SmartSearchControl).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, !!(this.control.config.nowild));
                            }
                        });

                        if (!req) { return; }
                        Danel.SearchRequest.IsNew = true;
                        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 (selectedValues.indexOf(dicItem.value) != -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;
                    var fakeelement = jQuery("<div/>").addClass("FilterBox").appendTo(Danel.SmartSearchControl).show();
                    var elementwidth = fakeelement.width();
                    fakeelement.remove();
                    jQuery(this.targetElement).dropdownchecklist({ width: this.config.width || elementwidth || "100px", 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;
                    if (this.config.FilterResults) {
                        this.loadFilters();
                    }

                    this.searchControls = [];
                    var p = this;
                    jQuery(".ResultsArea", Danel.SmartSearchControl).hide();
                    jQuery(".AjaxLoader", Danel.SmartSearchControl).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);
                    });

                },

                loadFilters: function () {
                    for (var x in this.config.FilterResults) {
                        if (this.config.FilterResults[x] == "") { continue; }
                        var ctext = "";
                        var cval = "";
                        for (var i = 0, items = this.config.FilterResults[x].split(","); i < items.length; i++) {
                            if (Danel.getDictionary(x).getValue(items[i]) == null || Danel.getDictionary(x).getValue(items[i]) == "") { continue; }
                            if (ctext.length > 0) { ctext += ","; cval += "," }
                            ctext += Danel.getDictionary(x).getValue(items[i]);
                            cval += items[i];
                        }
                        Danel.SearchRequest.Filters[x].setValue({ value: cval, text: ctext });
                        Danel.b_customquery = true;
                    }
                }
            });
        }, Danel.Controls.Control);
        Danel.Controls.SmartSearch.prototype = new Danel.Controls.Control();


        //Initialize DanelModule
        var init = function () {

            MainElement.GetContextObject = function () { return Danel; };
            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 + "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(MainElement);
            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 initLinks = function () {
                jQuery(".FieldScreen a").click(function () {
                    jQuery.fancybox.close();
                    var fieldvalue = jQuery(this).attr("value");
                    Danel.SearchRequest.Filters.Fields.setValue({ "text": Danel.getDictionary("Fields").getValue(fieldvalue), "value": fieldvalue, item: {} });
                    Danel.requestSearchResults();
                });
            };

            if (Danel.SmartSearchControl.control.config.FacebookDisplay) {
                obj.appendTo(".FieldSearchArea");
                jQuery("<div style='clear:both' />").appendTo(".FieldScreen");
                initLinks();
            }
            else {

                var fancy = jQuery(".FieldSearch", Danel.SmartSearchControl).fancybox(
                {
                    'transitionIn': 'elastic',
                    'transitionOut': 'elastic',
                    'easingIn': 'easeOutBack',
                    'easingOut': 'easeInBack',
                    'speedIn': 350,
                    'speedOut': 350,
                    'width': 600,
                    'autoDimensions': false,
                    'content': obj.html()
                }).click(initLinks);
            }



        };

        //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);


    };



    jQuery(function () {
        jQuery.ajaxSettings.traditional = true;
        window.DanelDebug = [];
        jQuery(".DanelModule").each(function () {
            var instance = {};
            createInstance(instance, this);
            jQuery(this).find(".DanelExtension").each(function () {
                this.DanelObject = instance;
            });
            window.DanelDebug.push(instance);

        });
    });
})();

        
