﻿(function ($) {

    var _searchDb = null;
    var _params = {};

    var availableTlds = ["com", "net", "org", "co", "me", "biz", "us", "mobi", "info", "asia"];
    var availableDatabases = ["available", "sedomarket", "godaddypremium"];
    var availableSort = [{ name: "", text: "Relevance" },
                        { name: "price", text: "Price - Cheaper first" },
                        { name: "-price", text: "Price - Expensive first" },
                        { name: "keyscount", text: "Number of Words - Shortest first" },
                        { name: "length", text: "Character Length - Shortest first" },
                        { name: "name", text: "A - Z" },
                        { name: "-name", text: "Z - A"}];
    var availableLanguages = [{ name: "en", text: "English" },
                               { name: "de", text: "German" },
                               { name: "es", text: "Spanish" },
                               { name: "it", text: "Italian" },
                               { name: "fr", text: "French" },
                               { name: "pt", text: "Portuguese"}];

    var methods = {
        init: function (params) {
            _params = params;
        },
        loading: function () {
            RenderLoading(this);
        },
        display: function (search) {
            _searchDb = search;

            return this.each(function () {
                //try {
                RenderLive(this);
                //}
                //catch (err) {
                //     $().Errors("show", err.description);

                // }

            });
        },
        deleteSyn: function (i, j) {
            try {
                _searchDb.Fields[0].Keys[i].splice(j, 1);
                this.each(function () {
                    RenderLive(this);
                });
            }
            catch (err) {
                $().Errors("show", err.description);

            }


        },
        getParams: function () {

            return GetUpdateParameters();

        },
        showMenu: function (name) {
            try {
                ShowLiveBotMenu(name);
            }
            catch (err) {
                $().Errors("show", err.description);
            }

        }

    };


    $.fn.LiveBot = function (method) {
        if (methods[method]) {


            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.LiveBot');
        }
    };



    function GetUpdateParameters() {
        var query = "";

        if (_searchDb == null)
            return query;


        // Build syns
        query += "&sy=";
        var syNum = 0;
        $.each(_searchDb.Fields[0].Keys, function (i, keys) {
            $.each(keys, function (j, k) {
                if (k != null) {
                    query += k.Key + ",";
                    syNum++;
                }
            });
            query += "|";
        });

        //if (syNum == _searchDb.Fields[0].Keys.length)
        //_searchDb.Fields[0].SpinSynonyms = false;

        //Use syns

        query += "&us=" + _searchDb.Fields[0].SpinSynonyms;

        //Build Prefixes
        query += "&pre=";
        if (_searchDb.Fields[0].Prefixes != null && _searchDb.Fields[0].Prefixes.length > 0) {

            $.each(_searchDb.Fields[0].Prefixes, function (i, pref) {

                query += pref.Key + ",";

            });


        }


        //Build Suffixes
        query += "&suf=";
        if (_searchDb.Fields[0].Suffixes != null && _searchDb.Fields[0].Suffixes.length > 0) {

            $.each(_searchDb.Fields[0].Suffixes, function (i, pref) {

                query += pref.Key + ",";
            });

        }

        // Build tlds

        supportedExtensions = new Array();
        //alert(document.supportedExtensions.length);
        query += "&t=";
        $.each(_searchDb.Tlds, function (i, tld) {
            if (tld.selected) {
                query += tld.tld + ",";
                supportedExtensions.push(tld.tld);
            }


        });

        // Build databses

        query += "&d=";

        $.each(_searchDb.Databases, function (i, db) {

            query += db + ",";

        });

        // Build filters
        query += BuildFilterValue("fb", "bool");
        query += BuildFilterValue("mink");
        query += BuildFilterValue("maxk");
        query += BuildFilterValue("minl");
        query += BuildFilterValue("maxl");
        query += BuildFilterValue("minp");
        query += BuildFilterValue("maxp");

        query += BuildFilterValue("fn", "bool");
        query += BuildFilterValue("fd", "bool");

        query += "&ar=" + _searchDb.Fields[0].AddRelated;
        query += "&av=" + _searchDb.Fields[0].AddVariations;
        // Order by
        query += "&ob=";
        if (_searchDb.OrderBy != null && _searchDb.OrderBy.length > 0 && _searchDb.OrderBy[0] != "")
            query += _searchDb.OrderBy[0];


        var anchor = null;
        if (_searchDb.Fields[0].AnchorLeft == true)
            anchor = "left";
        if (_searchDb.Fields[0].AnchorRight == true)
            anchor = "right";

        query += "&an=" + anchor;
        query += "&rk=" + _searchDb.Fields[0].RemoveKeys;



        query += "&l=";

        $.each(_searchDb.SupportedLanguages, function (i, lan) {

            query += lan + ",";

        });

        SendTypeInRequest($('input#searchBoxResults').val());

        return query;
    }

    function RenderLoading(targetObj) {

        // $(targetObj).viewManager("get", "liveBot_loading", { model: _searchDb });
    }

    function RenderLive(targetObj) {
        _searchDb.Tlds = GetTldModel();
        $(targetObj).viewManager("get", "liveBot", { model: _searchDb });



        $('a[bind="livebot"]').click(function () { a_OnClick($(this)); });
        $('input[bind="livebot"]').keyup(function (event) {
            event.preventDefault();
            if (!IsChar(event.keyCode) || $(this).val() == "")
                return false;
            input_onKeyUp($(this), event);
        });

        // Syns


        $('#chkSyns').click(function () {
            TE("/live/syns/" + this.checked);
            if (!this.checked) {
                //Close

                $('div[bind="live_bot_check"][type="useSyns_Expand"]').slideUp('slow', function () {

                });


                _searchDb.Fields[0].SpinSynonyms = false;

            }
            else {
                $('div[bind="live_bot_check"][type="useSyns_Expand"]').slideDown('slow', function () {
                    // Animation complete.
                });

                _searchDb.Fields[0].SpinSynonyms = true;
            }
            _params.updateCallback(GetUpdateParameters());
        });

        $('img[bind="livebot"][name="save"]').click(function (event) {

            syns_onClose(event);
            TE("/live/syns/save");
        });

        $('img[bind="livebot"][name="cancel"]').click(function (event) {
            //alert($(this).attr("key"));
            $('textarea[bind="livebot"][synsEdit="true"][key="' + $(this).attr("key") + '"]').text("");
            TE("/live/syns/delete");
            syns_onClose(event);

        });

        $('textarea[bind="livebot"][synsEdit="true"]').keyup(function (event) {
            //alert('a');
            $('img[bind="livebot"][name="save"][key="' + $(this).attr("key") + '"]').css("display", "block");
        });

        var tlds_check = $('input[bind="livebot"][field="tlds"]');

        tlds_check.change(function (event) {

            tld_onClose(null, this.value, this.checked);
            _params.updateCallback(GetUpdateParameters());
            TE("/live/tlds/" + this.value + "/" + this.checked);
        });


        //Variations
        $('#chkVariations').change(function () {
            TE('/live/variations/' + this.checked);
            if (!this.checked) {
                _searchDb.Fields[0].AddVariations = false;

            }
            else {

                _searchDb.Fields[0].AddVariations = true;

            }
            _params.updateCallback(GetUpdateParameters());

        });

        //Related

        $('#chkRelated').change(function (event) {
            TE('/live/related/' + this.checked);
            _searchDb.Fields[0].AddRelated = this.checked;

            _params.updateCallback(GetUpdateParameters());
        });

        //Prefixes
        $('#chkPrefixes').change(function () {
            TE('/live/prefixes/' + this.checked);
            if (!this.checked) {


                _searchDb.Fields[0].Prefixes = null;

            }
            else {


                _searchDb.Fields[0].Prefixes = jQuery.parseJSON($('textarea[viewmanager="dataSection"][name="defaultPrefixes"]').val());

            }
            _params.updateCallback(GetUpdateParameters());

        });

        var qTipPrefixesContainer = $('<div bind="livebot" type="prefixContainer"></div>');

        qTipPrefixesContainer.viewManager("get", "LiveBotPrefixesEdit", { model: { Prefixes: _searchDb.Fields[0].Prefixes} });

        SetQTip(qTipPrefixesContainer, "Edit Prefixes", $('#__livebot_editPrefixes'),
                function (event) {
                    prefixes_onClose(event);
                    $('#__livebot_editPrefixes').qtip("destroy");
                },
                function (event) {
                    TE('/live/prefixes/show');
                    if (_searchDb.Fields[0].Prefixes == null || _searchDb.Fields[0].Prefixes.length == 0) {
                        var defaultPrefixes = jQuery.parseJSON($('textarea[viewmanager="dataSection"][name="defaultPrefixes"]').val());
                        _searchDb.Fields[0].Prefixes = defaultPrefixes;
                        $('#chkPrefixes').checked = true;
                        $('div[bind="livebot"][type="prefixContainer"]').viewManager("get", "LiveBotPrefixesEdit", { model: { Prefixes: defaultPrefixes} });
                    }

                    $('select[bind="livebot"][name="prefixesTerms"]').change(function () {
                        var selected = $(this).val();
                        if (selected != "none") {
                            var dummy = $("<div></div>");
                            dummy.viewManager("get", selected, null);
                            //console.log(dummy.text());
                            $('textarea[bind="livebot"][prefixesEdit="true"]').val(dummy.text());

                        }
                        else {
                            $('textarea[bind="livebot"][prefixesEdit="true"]').val("");
                        }
                        TE('/live/prefixes/change/' + selected);
                    });

                    $('a[bind="livebot"][prefixesEdit="true"]').click(function () {
                        TE('/live/prefixes/save');
                        prefixes_onClose(event);

                        $('#__livebot_editPrefixes').qtip("destroy");

                    });

                });


        //Suffixes
        $('#chkSuffixes').change(function () {
            TE('/live/suffixes/' + this.checked);
            if (!this.checked) {

                _searchDb.Fields[0].Suffixes = null;

            }
            else {

                _searchDb.Fields[0].Suffixes = jQuery.parseJSON($('textarea[viewmanager="dataSection"][name="defaultSuffixes"]').val());

            }
            _params.updateCallback(GetUpdateParameters());
        });

        var qTipSuffixesContainer = $('<div bind="livebot" type="suffixContainer"></div>');

        qTipSuffixesContainer.viewManager("get", "LiveBotSuffixesEdit", { model: { Suffixes: _searchDb.Fields[0].Suffixes} });

        SetQTip(qTipSuffixesContainer, "Edit Suffixes", $('#__livebot_editSuffixes'),
            function (event) {
                suffixes_onClose(event);
                $('#__livebot_editSuffixes').qtip("destroy");
            },
            function (event) {
                TE('/live/suffixes/show');
                if (_searchDb.Fields[0].Suffixes == null || _searchDb.Fields[0].Suffixes.length == 0) {
                    var defaultSuffixes = jQuery.parseJSON($('textarea[viewmanager="dataSection"][name="defaultSuffixes"]').val());
                    _searchDb.Fields[0].Suffixes = defaultSuffixes;
                    $('#chkSuffixes').checked = true;
                    $('div[bind="livebot"][type="suffixContainer"]').viewManager("get", "LiveBotSuffixesEdit", { model: { Suffixes: defaultSuffixes} });
                }

                $('select[bind="livebot"][name="suffixesTerms"]').change(function () {

                    var selected = $(this).val();
                    if (selected != "none") {
                        var dummy = $("<div></div>");
                        dummy.viewManager("get", selected, null);
                        //console.log(dummy.text());
                        $('textarea[bind="livebot"][suffixesEdit="true"]').val(dummy.text());
                    }
                    else {
                        $('textarea[bind="livebot"][suffixesEdit="true"]').val("");
                    }
                    TE('/live/suffixes/change/' + selected);
                });
                $('a[bind="livebot"][suffixesEdit="true"]').click(function () {
                    TE('/live/suffixes/save');
                    suffixes_onClose(event);
                    $('#__livebot_editSuffixes').qtip("destroy");
                });

            });

        // Available

        $('#chkAvailable').click(function () {
            TE('/live/available/' + this.checked);
            if (!this.checked) {
                SwitchAvailable(false);
            }
            else {
                SwitchAvailable(true);
                SetPriceRange({ Text: "0", Value: "0" }, { Text: "Any", Value: "10000000" });
            }
            _params.updateCallback(GetUpdateParameters());
        });

        var dbsModels = GetDatabaseModel();
        var uldbs = $("<ul></ul>");

        $.each(dbsModels, function (i, db) {
            var lidbs = $("<li></li>");
            lidbs.viewManager("get", "chkLivebot", { model: db });
            uldbs.append(lidbs);
        });

        /*SetQTip(uldbs, "Edit Database", $('#__livebot_editDbs'), function (event) {
        dbs_onClose(event);
        }, null);*/


        // Forsale

        $('#chkForSale').click(function () {
            TE('/live/forsale/' + this.checked);
            if (!this.checked) {
                //Close

                SwitchForsale(false);

            }
            else {
                //Open
                SwitchForsale(true);

            }
            _params.updateCallback(GetUpdateParameters());
        });


        //Use Sedo
        $('#chkSedo').change(function () {
            TE('/live/forsale/sedo' + this.checked);
            if (!this.checked) {

                SwitchSedo(false);
            }
            else {
                SwitchSedo(true);
            }
            _params.updateCallback(GetUpdateParameters());
        });

        //Use GodaddyPremium
        $('#chkGodaddy').change(function () {
            TE('/live/forsale/godaddy' + this.checked);
            if (!this.checked) {

                SwitchGodaddyPremium(false);

            }
            else {
                SwitchGodaddyPremium(true);
            }
            _params.updateCallback(GetUpdateParameters());
        });


        //Languages

        var select = $('div[bind="live_bot_check"][type="useLanguage"]').find('select');

        $.each(availableLanguages, function () {
            var selected = "";
            if (_searchDb.CurrentLanguage == this.name)
                selected = 'selected="yes"';
            select.append('<option value="' + this.name + '" ' + selected + ' >' + this.text + '</option>');
        });

        select.change(function () {
            TE('/live/language/' + $(this).val());
            _searchDb.SupportedLanguages = new Array();
            _searchDb.SupportedLanguages.push($(this).val());
            _params.updateCallback(GetUpdateParameters());
        });

        // Order by

        var selectOrderBy = $('div[bind="live_bot_check"][type="orderBy"]').find('select');

        $.each(availableSort, function () {
            var selected = "";
            if (_searchDb.OrderBy[0] == this.name)
                selected = 'selected="yes"';
            selectOrderBy.append('<option value="' + this.name + '" ' + selected + ' >' + this.text + '</option>');
        });

        selectOrderBy.change(function () {
            TE('/live/orderby/' + $(this).val());
            _searchDb.OrderBy = [];
            _searchDb.OrderBy.push($(this).val());
            if ($(this).val() != "") {
                _searchDb.Fields[0].RemoveKeys = false;
            }

            _params.updateCallback(GetUpdateParameters());
        });


        //Badwords 
        $('#chkBad').change(function () {
            TE('/live/excludeoffensive/' + this.checked);
            if (!this.checked) {

                SwitchFilter("fb", false);

            }
            else {

                SwitchFilter("fb", true);

            }
            _params.updateCallback(GetUpdateParameters());
        });

        //Dash 
        $('#chkDash').change(function () {
            TE('/live/excludedashes/' + this.checked);
            if (!this.checked) {


                SwitchFilter("fd", false);

            }
            else {

                SwitchFilter("fd", true);

            }
            _params.updateCallback(GetUpdateParameters());
        });

        //Numbers 
        $('#chkNumbers').change(function () {
            TE('/live/excludenumbers/' + this.checked);
            if (!this.checked) {


                SwitchFilter("fn", false);

            }
            else {

                SwitchFilter("fn", true);

            }
            _params.updateCallback(GetUpdateParameters());
        });

        //Require all words 
        $('#chkRWords').change(function () {
            TE('/live/requireallkeys/' + this.checked);
            if (!this.checked) {


                _searchDb.Fields[0].RemoveKeys = true;

            }
            else {

                _searchDb.Fields[0].RemoveKeys = false;

            }
            _params.updateCallback(GetUpdateParameters());
        });

        //Price range
        var priceSlider = $('div[bind="live_bot_check"][type="usePrice"]');
        var currentPrice = GetPriceRange();

        //alert(currentPrice[0] + " " + currentPrice[1]);

        priceSlider.slider({
            range: true,
            min: 0,
            max: 12,
            steps: 12,
            values: currentPrice,
            slide: function (event, ui) {
                var min = GetPriceStep(ui.values[0]);
                var max = GetPriceStep(ui.values[1]);
                $('span[bind="live_bot_check"][type="priceCaption"]').html(min.Text + " - " + max.Text);
                SetPriceRange(min, max);
                SwitchAvailable(false);
                //_params.updateCallback(GetUpdateParameters());
            },
            stop: function () {
                TE('/live/price/slide');
                _params.updateCallback(GetUpdateParameters());
            }
        });



        $('span[bind="live_bot_check"][type="priceCaption"]').html(GetPriceStep(currentPrice[0]).Text + " - " + GetPriceStep(currentPrice[1]).Text);

        //Len range
        var lenSlider = $('div[bind="live_bot_check"][type="useLen"]');

        var currentLen = GetLen();
        //alert(currentLen);
        lenSlider.slider({
            range: false,
            min: 1,
            max: 13,
            steps: 11,
            value: currentLen,
            slide: function (event, ui) {

                var min = GetLenStep(ui.value);
                $('span[bind="live_bot_check"][type="lenCaption"]').html(min.Text);
                SetLen(min);

            },
            stop: function () {
                TE('/live/dnlen/slide');
                _params.updateCallback(GetUpdateParameters());
            }
        });

        $('span[bind="live_bot_check"][type="lenCaption"]').html(GetLenStep(currentLen).Text);

        //Len Keywords range
        var lenKSlider = $('div[bind="live_bot_check"][type="useLenK"]');
        var currentLenK = GetLenKeywords();
        lenKSlider.slider({
            range: false,
            min: 0,
            max: 6,
            steps: 6,
            value: currentLenK,
            slide: function (event, ui) {
                var min = GetLenKeywordsStep(ui.value);
                $('span[bind="live_bot_check"][type="lenKCaption"]').html(min.Text);
                SetLenKeywords(min);
                //_params.updateCallback(GetUpdateParameters());
            },
            stop: function () {
                TE('/live/kysnum/slide');
                _params.updateCallback(GetUpdateParameters());
            }
        });

        $('span[bind="live_bot_check"][type="lenKCaption"]').html(GetLenKeywordsStep(currentLenK).Text);







        // Bind live bot menu

        $('a[bind="live_bot_menu_button"]').click(function () {

            ShowLiveBotMenu($(this).attr('name'));

        });

        // Render toolbar

        RenderToolbar();

    }
    function RenderToolbar() {

        var t_data = new Array();


        var available = $.inArray("available", _searchDb.Databases) > -1;
        var sedo = $.inArray("sedomarket", _searchDb.Databases) > -1;
        var godaddy = $.inArray("godaddypremium", _searchDb.Databases) > -1;


        // t_data.push({ Name: "all", Bind: "live_dbs", Caption: "All domains", Active: (available && (sedo || godaddy)) });

        t_data.push({ Name: "available", Bind: "live_dbs", Caption: "Available", Active: (available) });

        t_data.push({ Name: "premium", Bind: "live_dbs", Caption: "Premium", Active: ((sedo || godaddy)) });


        $("#toolbarBox").viewManager("get", "liveToolbar", { model: t_data });
        //$("#toolbar").buttonset();
        //console.log($("#toolbar").find('input[type="radio"]'));
        $("#toolbar").find('input[type="checkbox"]').click(function () {
            // Click event


            if ($(this).attr("bind") == "live_dbs") {
                TE('/live/toolbar/' + $(this).attr("name"));
                if ($(this).attr("name") == "available") {
                    //SwitchForsale(false); 
                    SwitchAvailable(this.checked);
                }
                else if ($(this).attr("name") == "premium") {
                    //alert(this.checked);
                    SwitchForsale(this.checked);
                    //SwitchAvailable(false);
                }

            }

            _params.updateCallback(GetUpdateParameters());
        });
    }
    function SwitchGodaddyPremium(open) {
        if (open) {

            _searchDb.Databases.push("godaddypremium");
        }
        else {


            var j = $.inArray("godaddypremium", _searchDb.Databases);
            _searchDb.Databases.splice(j, 1);

            if (_searchDb.Databases.length == 0) {
                _searchDb.Fields[0].AddRelated = true;
                _searchDb.Databases.push("available");
            }
        }
    }

    function SwitchSedo(open) {
        if (open) {
            //On

            _searchDb.Databases.push("sedomarket");

        }
        else {
            // Off


            var j = $.inArray("sedomarket", _searchDb.Databases);
            _searchDb.Databases.splice(j, 1);

            if (_searchDb.Databases.length == 0) {
                _searchDb.Fields[0].AddRelated = true;
                _searchDb.Databases.push("available");
            }
        }
    }

    function SwitchForsale(open) {
        if (open) {
            $('input[id="chkForSale"]').attr('checked', true);
            $('div[bind="live_bot_check"][type="useForsale_Expand"]').slideDown('slow', function () {
                // Animation complete.
            });
            console.log(_searchDb.Databases);
            var i = $.inArray("available", _searchDb.Databases);

            if (i > -1) {
                _searchDb.Databases = availableDatabases;
            }
            else {
                _searchDb.Databases = availableDatabases;
                var j = $.inArray("available", _searchDb.Databases);
                _searchDb.Databases.splice(j, 1);
            }
        }
        else {
            //Close
            $('input[id="chkForSale"]').attr('checked', false);
            $('div[bind="live_bot_check"][type="useForsale_Expand"]').slideUp('slow', function () {

            });



            _searchDb.Databases = new Array();
            _searchDb.Databases.push("available");
            if ($('div[bind="live_bot_check"][type="useAvail"]').attr("val") == "false") {
                _searchDb.Fields[0].AddRelated = true;
            }
        }
    }

    function SwitchAvailable(open) {
        if (open) {
            $('input[id="chkAvailable"]').attr('checked', true);
            // Open
            $('div[bind="live_bot_check"][type="useAvail_Expand"]').slideDown('slow', function () {
                // Animation complete.
            });


            _searchDb.OrderBy = [];
            _searchDb.Fields[0].AddRelated = true;
            _searchDb.Databases.push("available");
        }
        else {

            //Close
            $('input[id="chkAvailable"]').attr('checked', false);

            $('div[bind="live_bot_check"][type="useAvail_Expand"]').slideUp('slow', function () {

            });

            if (_searchDb.Databases.length > 1) {
                var i = $.inArray("available", _searchDb.Databases);

                if (i > -1) {
                    _searchDb.Databases.splice(i, 1);
                }
            }
            else {
                _searchDb.Databases = availableDatabases;

                var i = $.inArray("available", _searchDb.Databases);

                if (i > -1) {
                    _searchDb.Databases.splice(i, 1);
                }
            }

            _searchDb.Fields[0].AddRelated = false;
        }

    }


    function ShowLiveBotMenu(name) {
        $('div[bind="live_bot_menu_button_selector"]').removeClass("sel");


        $('div[name="' + name + '"][bind="live_bot_menu_button_selector"]').addClass("sel");

        $('div[bind="live_bot_menu"]').css("display", "none");
        $('div[bind="live_bot_menu"][name="' + name + '"]').css("display", "block");
    }

    function SetQTip(_content, _title, _target, beforeHideEvent, beforeShowEvent) {

        _target.qtip({
            content: { text: _content, title: { text: _title} },
            show: { solo: true, when: { event: 'click'} },
            hide: { when: 'click', fixed: true },
            position: { target: _target, corner: { target: "rightMiddle", tooltip: "leftMiddle" }, adjust: { x: 10} },
            style: {
                width: 'auto',
                padding: 5,
                background: '#ffffff',
                color: 'black',
                //textAlign: 'center',
                border: {
                    width: 1,
                    radius: 3,
                    color: 'rgba(0, 0, 0, 0.1)'
                },
                tip: { // Now an object instead of a string
                    corner: 'leftMiddle', // We declare our corner within the object using the corner sub-option
                    color: 'rgba(0, 0, 0, 0.1)',
                    border: 2,
                    size: {
                        x: 10, // Be careful that the x and y values refer to coordinates on screen, not height or width.
                        y: 10 // Depending on which corner your tooltip is at, x and y could mean either height or width!
                    }
                }
            },
            api: {
                beforeHide: function (event) {
                    if (beforeHideEvent != null)
                        beforeHideEvent(event);
                },
                beforeShow: function (event) {
                    if (beforeShowEvent != null)
                        beforeShowEvent(event);
                },
                onDestroy: function () { }
            }
        });



    }





    function GetLenKeywordsStep(i) {

        if (i < 1)
            return { Text: "All", Value: i };
        if (i < 6)
            return { Text: "Max " + i, Value: i };
        else
            return { Text: "> 5", Value: i }
    }

    function GetLenStep(i) {
        //alert(i);
        if (i < 2)
            return { Text: "All Characters", Value: i };
        if (i < 13)
            return { Text: "Max " + i + " Characters", Value: i };
        else
            return { Text: "> 12 Characters", Value: i }
    }

    function GetLenKeywords() {
        var mink = GetFieldValue(_searchDb, "mink");
        var maxk = GetFieldValue(_searchDb, "maxk");

        if (mink != null && mink > 5) {
            return 6;
        }
        else if (maxk == null && mink == null)
            return 0;
        else if (mink != null && maxk != null && mink < 2 && maxk < 0) {
            return 0;
        }
        else if (maxk != null && maxk > 0)
            return maxk;
    }

    function GetLen() {
        var minl = GetFieldValue(_searchDb, "minl");
        var maxl = GetFieldValue(_searchDb, "maxl");
        //alert(minl + " " + maxl);
        if (minl != null && minl > 12) {
            return 13;
        }
        else if (maxl == null && minl == null)
            return 1;
        else if (minl != null && maxl != null && minl < 2 && maxl < 0) {
            return 1;
        }
        else if (maxl != null && maxl > 1)
            return maxl;
        else if (minl != null && minl > 1)
            return minl;
    }

    function GetPriceRange() {
        var min = 0;
        var max = 12;

        var minp = GetFieldValue(_searchDb, "minp");
        var maxp = GetFieldValue(_searchDb, "maxp");


        //alert("getpricerange " + minp + " " + maxp);

        if (minp != null) {
            min = GetPriceStepFromValue(minp);
        }

        if (maxp != null) {
            max = GetPriceStepFromValue(maxp);
        }


        return [min, max];

    }
    function SetLen(maxLen) {
        if (maxLen.Value < 2) {
            var index = GetFieldIndexStartWith(_searchDb, "maxl");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);
            AddFieldValue(_searchDb, "maxl", -1);

            index = GetFieldIndexStartWith(_searchDb, "minl");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);
            AddFieldValue(_searchDb, "minl", maxLen.Value - 1);

        } else if (maxLen.Value > 12) {
            var index = GetFieldIndexStartWith(_searchDb, "maxl");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);
            AddFieldValue(_searchDb, "maxl", -1);

            index = GetFieldIndexStartWith(_searchDb, "minl");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);

            AddFieldValue(_searchDb, "minl", maxLen.Value);
        }
        else {
            var index = GetFieldIndexStartWith(_searchDb, "maxl");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);

            index = GetFieldIndexStartWith(_searchDb, "minl");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);
            AddFieldValue(_searchDb, "minl", -1);
            AddFieldValue(_searchDb, "maxl", maxLen.Value);

        }

    }
    function SetLenKeywords(maxLen) {
        if (maxLen.Value < 1) {
            var index = GetFieldIndexStartWith(_searchDb, "maxk");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);
            AddFieldValue(_searchDb, "maxk", -1);

            index = GetFieldIndexStartWith(_searchDb, "mink");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);
            AddFieldValue(_searchDb, "mink", -1);

        } else if (maxLen.Value > 5) {
            var index = GetFieldIndexStartWith(_searchDb, "maxk");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);
            AddFieldValue(_searchDb, "maxk", -1);
            index = GetFieldIndexStartWith(_searchDb, "mink");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);

            AddFieldValue(_searchDb, "mink", maxLen.Value);
        }
        else {
            var index = GetFieldIndexStartWith(_searchDb, "maxk");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);

            index = GetFieldIndexStartWith(_searchDb, "mink");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);
            AddFieldValue(_searchDb, "mink", -1);
            AddFieldValue(_searchDb, "maxk", maxLen.Value);

        }

    }

    function SetPriceRange(min, max) {

        if (min.Value == 0 || min.Value == 10000000) {
            var index = GetFieldIndexStartWith(_searchDb, "minp");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);
            AddFieldValue(_searchDb, "minp", 0);
        }

        if (max.Value == 0 || max.Value == 10000000) {
            var index = GetFieldIndexStartWith(_searchDb, "maxp");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);
            AddFieldValue(_searchDb, "maxp", 10000000);
        }

        if (min.Value > 0 && min.Value < 10000000) {
            var index = GetFieldIndexStartWith(_searchDb, "minp");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);

            AddFieldValue(_searchDb, "minp", min.Value);

        }

        if (max.Value > 0 && max.Value < 10000000) {
            var index = GetFieldIndexStartWith(_searchDb, "maxp");
            if (index > -1)
                _searchDb.Filters[0].splice(index, 1);
            AddFieldValue(_searchDb, "maxp", max.Value);
        }


    }


    function GetPriceStep(i) {
        //alert(i);
        if (i == 0) {
            return { Text: "0", Value: "0" };
        }
        else if (i == 1)
            return { Text: "$100", Value: "100" };
        else if (i == 2)
            return { Text: "$500", Value: "500" };
        else if (i == 3)
            return { Text: "$1,000", Value: "1000" };
        else if (i == 4)
            return { Text: "$2,000", Value: "2000" };
        else if (i == 5)
            return { Text: "$5,000", Value: "5000" };
        else if (i == 6)
            return { Text: "$10,000", Value: "10000" };
        else if (i == 7)
            return { Text: "$30,000", Value: "30000" };
        else if (i == 8)
            return { Text: "$50,000", Value: "50000" };
        else if (i == 9)
            return { Text: "$80,000", Value: "80000" };
        else if (i == 10)
            return { Text: "$100,000", Value: "100000" };
        else if (i == 11)
            return { Text: "$500,000", Value: "500000" };
        else if (i == 12)
            return { Text: "Any", Value: "10000000" };
    }



    function GetPriceStepFromValue(val) {

        if (val == 0) {
            return 0;
        }
        else if (val == 100) {
            return 1;
        }
        else if (val == 500) {
            return 2;
        }
        else if (val == 1000) {
            return 3;
        }
        else if (val == 2000) {
            return 4;
        }
        else if (val == 5000) {
            return 5;
        }
        else if (val == 10000) {
            return 6;
        }
        else if (val == 30000) {
            return 7;
        }
        else if (val == 50000) {
            return 8;
        }
        else if (val == 80000) {
            return 9;
        }
        else if (val == 100000) {
            return 10;
        }
        else if (val == 500000) {
            return 11;
        }
        else if (val == 10000000) {
            return 12;
        }
    }

    // Events



    function dbs_onClose(event) {

        var checks = $('input[bind="livebot"][field="databases"]:checked');

        //Update Data

        _searchDb.Databases = [];

        $.each(checks, function (i, dbs) {

            _searchDb.Databases.push(dbs.value);

        });

        _params.updateCallback(GetUpdateParameters());
    }

    function syns_onClose(event) {

        var synsArea = $('textarea[bind="livebot"][synsEdit="true"]');

        // Update Data

        _searchDb.Fields[0].Keys = new Array();
        var allEmpty = true;
        $.each(synsArea, function () {

            var syns = new Array();

            syns.push({ Key: $(this).attr("key") });
            //alert($(this).attr("key"));
            if ($(this).val() != "") {
                var toAdd = $(this).val().split(",");

                $.each(toAdd, function () {

                    if (this != "") {
                        syns.push({ Key: this });
                        allEmpty = false;
                    }

                });
            }

            _searchDb.Fields[0].Keys.push(syns);

        });
        if (allEmpty)
            _searchDb.Fields[0].SpinSynonyms = false;


        _params.updateCallback(GetUpdateParameters());

    }

    function prefixes_onClose(event) {

        var prefixesArea = $('textarea[bind="livebot"][prefixesEdit="true"]');

        // Update Data

        _searchDb.Fields[0].Prefixes = new Array();


        var toAdd = prefixesArea.val().split(",");

        $.each(toAdd, function () {

            if (this != "") {
                _searchDb.Fields[0].Prefixes.push({ Key: this });
            }

        });


        _params.updateCallback(GetUpdateParameters());

    }

    function suffixes_onClose(event) {

        var suffixesArea = $('textarea[bind="livebot"][suffixesEdit="true"]');

        // Update Data

        _searchDb.Fields[0].Suffixes = new Array();


        var toAdd = suffixesArea.val().split(",");

        $.each(toAdd, function () {

            if (this != "") {
                _searchDb.Fields[0].Suffixes.push({ Key: this });
            }

        });


        _params.updateCallback(GetUpdateParameters());

    }

    function GetTldModel() {

        var ret = new Array();

        $.each(availableTlds, function (i, a_tlds) {

            if ($.inArray(a_tlds, _searchDb.Tlds) > -1) {
                ret.push({ tld: a_tlds, selected: true, field: "tlds" });
            }
            else
                ret.push({ tld: a_tlds, selected: false, field: "tlds" });

        });

        return ret;

    }
    function tld_onClose(event, _tld, selected) {

        //var checks = $('input[bind="livebot"][field="tlds"]:checked');

        //Update Data
        if (_searchDb != null) {

            $.each(_searchDb.Tlds, function (i, tld) {
                if (tld.tld == _tld)
                    _searchDb.Tlds[i].selected = selected;

            });

        }


        //_params.updateCallback(GetUpdateParameters());
    }

    function input_onKeyUp(element, event) {
        var fieldname = element.attr("field");

        //TODO Check for only numbers
        //Update Data
        element.attr("data", element.val());

        //Update searchDb
        var index = GetFieldIndexStartWith(_searchDb, fieldname);
        if (index > -1) {
            _searchDb.Filters[0].splice(index, 1);
        }
        AddFieldValue(_searchDb, fieldname, element.val());

        _params.updateCallback(GetUpdateParameters());

    }

    function a_OnClick(element) {
        var fieldname = element.attr("field");
        if (fieldname == "databases") {
            // Read Data
            var s_data = element.attr("data");
            var data = {};
            data.Name = s_data.split(":")[0];
            data.Value = s_data.split(":")[1] == "true";

            // Change value
            data.Value = !data.Value;


            //Update searchDb

            if (data.Value) {
                _searchDb.Databases.push(data.Name);
            }
            else {
                var index = $.inArray(data.Name, _searchDb.Databases);
                _searchDb.Databases.splice(index, 1);
            }

            // Update UI
            if (data.Value) {
                element.css("color", "");
            }
            else {
                element.css("color", "Gray");
            }

            element.attr("data", data.Name + ":" + data.Value);
        }
        else if (fieldname == "fb" || fieldname == "fn" || fieldname == "fd") {
            // read data
            var data = element.attr("data") == "true";

            data = !data;
            //Update searchDb

            if (data) {
                AddFieldValue(_searchDb, fieldname, false);
            }
            else {
                var index = GetFieldIndexStartWith(_searchDb, fieldname);

                _searchDb.Filters[0].splice(index, 1);
            }

            // Update UI
            if (data) {
                element.css("color", "");
            }
            else {
                element.css("color", "Gray");
            }

            element.attr("data", data);
        }
        else if (fieldname == "ar" || fieldname == "av" || fieldname == "rk") {
            var data = element.attr("data") == "true";
            data = !data;
            if (fieldname == "av")
                _searchDb.Fields[0].AddVariations = data;
            if (fieldname == "ar")
                _searchDb.Fields[0].AddRelated = data;
            if (fieldname == "rk")
                _searchDb.Fields[0].RemoveKeys = data;


            if (data) {
                element.css("color", "");
            }
            else {
                element.css("color", "Gray");
            }

            element.attr("data", data);

        }


        _params.updateCallback(GetUpdateParameters());
    }

    function SwitchFilter(filterName, on) {
        if (on) {
            AddFieldValue(_searchDb, filterName, false);
        }
        else {
            var index = GetFieldIndexStartWith(_searchDb, filterName);

            _searchDb.Filters[0].splice(index, 1);
        }
    }



    function GetDatabaseModel() {

        var ret = new Array();

        $.each(availableDatabases, function (i, a_db) {

            if ($.inArray(a_db, _searchDb.Databases) > -1) {
                ret.push({ tld: a_db, selected: true, field: "databases" });
            }
            else
                ret.push({ tld: a_db, selected: false, field: "databases" });

        });

        return ret;

    }

    function GetLanguagesModel() { }

    //

    function BuildFilterValue(filterName, type) {

        var dummy = ExistField(_searchDb, filterName);
        if (dummy != null && dummy == true) {

            if (type != null && type == "bool") {
                return "&" + filterName + "=true";
            }
            else {

                return "&" + filterName + "=" + GetFieldValue(_searchDb, filterName);

            }

        }
        else {
            if (type == "bool") {
                return "&" + filterName + "=false";
            }
            else {
                return "";
            }
        }
        return "";
    }


    //  ...
    // end of closure
})(jQuery);
