﻿SearchMap = function(index, keyword, object) {
    this.Index = index;
    this.Keyword = keyword;
    this.CriteriaObject = object;
    this.ValueList = [];
    this.MaxValueLength = 99;
};
BasicOption = function(text, value) {
    this.Text = text;
    this.Value = value;
};
SearchHelper = function (url, searchConfig, searchMap, ignoredQueryStringKeys) {
    var MAXIMUM_VALUE_LENGTH_MESSAGE = 'En çok {0} seçenek işaretleyebilirsiniz!';
    var _config = searchConfig;
    var _map = searchMap;
    var _ignoredKeys = $.isArray(ignoredQueryStringKeys) ? ignoredQueryStringKeys : new Array();
    var _initialized = false;

    var _panelLinks = null;
    var _panels = null;
    var _summaries = null;
    var _summaryRoot = null;
    var _firstScreen = null;
    var _helpPanels = null;

    showPanel = function (panelIndex) {
        if (!panels().eq(panelIndex).is(':visible')) {
            panelLinks().removeClass('marked').eq(panelIndex).addClass('marked');
            panels().filter(':visible').slideUp();
            panels().eq(panelIndex).slideDown();
            helpPanels().hide();
            helpPanels().eq(panelIndex).show();

            if (panelIndex > 0 || hasCriteria()) {
                summaryRoot().show();
                firstScreen().hide();
            }
            else {
                firstScreen().show();
                summaryRoot().hide();
            }
        }
    };

    criteriaChanged = function (sender) {
        var idx = _map[sender.id].Index;
        if (idx > -1) {
            var valueList = getValue(sender) || [];
            if (valueList.length <= _map[sender.id].MaxValueLength) {
                _map[sender.id].ValueList = valueList;
                updateSummaryPanel(idx, sender);
            }
            else {
                if (_initialized) {
                    alert(MAXIMUM_VALUE_LENGTH_MESSAGE.replace('{0}', _map[sender.id].MaxValueLength));
                }
                setValueList(sender, _map[sender.id].ValueList);
            }
        }
    };

    updateSummaryPanel = function (panelIndex, sender) {
        var result;

        var $panel = summaries().eq(panelIndex);
        var $summary = $panel.children('div.summary');
        updateCriteriaPanel(getCriteriaPanel($summary, sender), sender);

        if ($summary.children(':not(:empty)').length > 0) {
            $panel.show();
        }
        else {
            $panel.hide();
        }

        updateSummaryRootPanel();
    };

    hasCriteria = function () {
        for (var item in _map) {
            var valueList = _map[item].ValueList;
            if (valueList != null && valueList.length > 0) {
                return true;
            }
        }
        return false;
    };

    updateSummaryRootPanel = function () {
        if (hasCriteria()) {
            firstScreen().hide();
            summaryRoot().show();
        }
    };

    updateCriteriaPanel = function ($criteriaPanel, sender) {
        $criteriaPanel.empty();

        var valueList = getValue(sender);
        if (valueList != null) {
            for (var i = 0; i < valueList.length; i++) {
                $criteriaPanel.append(getCriteriaRemoveLink(sender, valueList[i].Text, valueList[i].Value));
            };
        }
    };

    deleteCriteria = function (senderID, oldValue) {
        var sender = getCriteriaObject(senderID);
        if (sender != null) {
            setValue(sender, removeValue(getValue(sender), oldValue));
            criteriaChanged(sender);
        }
    };

    deleteCriteriaWithParams = function (event) {
        var sender = event.data.Sender;
        setValue(sender, removeValue(getValue(sender), event.data.Value));
        criteriaChanged(sender);
    };

    getCriteriaPanel = function ($summary, sender) {
        var result = $summary.children('div[forx=' + sender.id + ']');
        if (result.length === 0) {
            result = $('<div/>').attr('forx', sender.id);
            $summary.append(result);
        }
        return result;
    };

    getCriteriaRemoveLink = function (sender, text, value) {
        return $('<div>' + text + '</div>').prepend($('<a href="javascript:;"><img src="/Assets/Images/i_remove.gif" /></a>').bind('click', { "Sender": sender, "Value": value }, deleteCriteriaWithParams));
    };

    getCriteriaObject = function (item) {
        if (_map[item].CriteriaObject == null) {
            var $tmp = $('#' + item);
            if ($tmp.length > 0) {
                _map[item].CriteriaObject = $tmp[0];
            }
        }
        return _map[item].CriteriaObject;
    };

    buildQS = function (deleteIngoredKeys) {
        if (deleteIngoredKeys) {
            for (var i = 0; i < _ignoredKeys.length; i++) {
                $.Params.set(_ignoredKeys[i], "");
            }
        }
        for (var item in _map) {
            var valueList = _map[item].ValueList;
            $.Params.set(_map[item].Keyword, $.map(valueList || [], function (option) { return option.Value; }).join(','));
        }
    };

    search = function () {
        buildQS(true);
        document.location = url + $.Params.toString();
    };

    keydown = function (event) {
        event.cancelBubble = true;
        if (event.keyCode == 13) {
            event.preventDefault();
            search();
        }
    };

    init = function () {
        for (var item in _map) {
            var criteriaObject = getCriteriaObject(item);
            if (criteriaObject != null) {
                criteriaChanged(criteriaObject);
            }
        }
        panels().find('input, select').bind('keydown', keydown);
        _initialized = true;
    };

    // **************
    // Helper Methods
    // **************
    getValue = function (sender) {
        var result;
        if (typeof (sender.tagName) === 'string') {
            result = $getValue($(sender));
        }
        else if (typeof (sender.GetValue) === 'function') {
            //else {
            result = sender.GetValue();
        }
        return result;
    };

    $getValue = function ($sender) {
        var result;
        switch ($sender[0].tagName) {
            case 'INPUT':
                if ($sender.is(':checkbox')) {
                    if ($sender.is(':checked')) {
                        var $label = $sender.next('label[for=' + $sender.attr('id') + ']');
                        result = [{ "Text": $label.text(), "Value": $sender.val()}];
                    }
                }
                else if ($sender.val() !== '') {
                    result = [{ "Text": $sender.val(), "Value": $sender.val()}];
                }
                break;
            case 'SELECT':
                result = $.map($sender.children('option:selected'), function (option, idx) {
                    return { "Text": option.text, "Value": option.value };
                });
                break;
            default:
                result = new Array();
                break;
        }
        return result;
    };

    setValue = function (sender, value) {
        if (typeof (sender.tagName) === 'string') {
            $(sender).val(value);
        }
        else if (typeof (sender.SetValue) === 'function') {
            //else {
            sender.SetValue(value);
        }
    };

    setValueList = function (sender, valueList) {
        setValue(sender, $.map(valueList, function (item) { return item.Value; }));
    };

    removeValue = function (valueList, value) {
        var result = new Array();
        for (var i = 0; i < valueList.length; ++i) {
            if (valueList[i].Value !== value) {
                result.push(valueList[i].Value);
            }
        }
        return result;
    };

    panels = function () {
        if (_panels == null) {
            _panels = $(_config.Panels);
        }
        return _panels;
    };

    panelLinks = function () {
        if (_panelLinks == null) {
            _panelLinks = $(_config.PanelLinks);
        }
        return _panelLinks;
    };

    summaries = function () {
        if (_summaries == null) {
            _summaries = $(_config.Summaries);
        }
        return _summaries;
    };

    summaryRoot = function () {
        if (_summaryRoot == null) {
            _summaryRoot = $(_config.SummaryRoot);
        }
        return _summaryRoot;
    };

    firstScreen = function () {
        if (_firstScreen == null) {
            _firstScreen = $(_config.FirstScreen);
        }
        return _firstScreen;
    };

    helpPanels = function () {
        if (_helpPanels == null) {
            _helpPanels = $(_config.HelpPanels);
        }
        return _helpPanels;
    }

    this.BuildQS = buildQS;
    this.CriteriaChanged = criteriaChanged;
    this.ShowPanel = showPanel;
    this.DeleteCriteria = deleteCriteria;
    this.DeleteCriteriaWithParams = deleteCriteriaWithParams;
    this.Search = search;
    this.Map = _map;
    init();
};

CheckboxList = function(id, itemArray) {
    var self = this;

    changed = function() {
        if (typeof (self.OnChanged) === 'function') {
            self.OnChanged(self);
        }
    };

    setValue = function(valueList) {
        var filter = $.map(valueList, function(value) {
            return '[value=' + value + ']';
        }).join(',');

        self.CheckList.attr('checked', false);
        self.CheckList.filter(filter).attr('checked', true);
    };

    getValue = function() {
        var checkedInputList = self.CheckList.filter(':checked');
        return $.map(checkedInputList, function(input) {
            var $input = $(input);
            return { "Text": $input.next('label').text(), "Value": $input.val() };
        });
    };

    init = function() {
        self.CheckList.bind('change', changed);
    };

    this.id = id;
    this.CheckList = $($.map(itemArray || [], function(item) { return '#' + item; }).join(','));
    this.SetValue = setValue;
    this.GetValue = getValue;
    this.OnChanged;
    init();
};

AjaxDropDownTreeTracker = function(id, initialValueList, ajaxDropDownTree) {
    var self = this;
    var _valueList = initialValueList;
    var _adt = ajaxDropDownTree;

    getValue = function() {
        return _adt.IsLoaded() ? _adt.GetValue() : _valueList;
    };

    setValue = function(valueList) {
        if (!_adt.IsLoaded()) {
            _valueList = $.grep(_valueList, function(value) {
                return $.inArray(value.Value, valueList) > -1;
            });
        }
        _adt.SetCheckedValues(valueList);
    };

    changed = function() {
        if (typeof (self.OnChanged) === 'function') {
            self.OnChanged(self);
        }
    };

    this.id = id;
    this.GetValue = getValue;
    this.SetValue = setValue;
    this.OnChanged;
    _adt.BindOnChanged(changed);
};

AjaxDropDownTreeViewer = function(controlID) {
    var _isVisible = false;
    this.Show = function() {
        if (!_isVisible) {
            _isVisible = true;
            controlID.Toggle();
        }
    }
};

