var App_Product_Search = Class.create();
var appSearch = null;

App_Product_Search.prototype =
{
    _countSectionItems:0,
    adapterAlias: null,
    selector: null,
    defaultSectionMax: 5,
    sectionOptions: {},
    autocompleteOptions: {},
    categories: {},

    initialize: function (options)
    {
        this.setOptions(options);
        var obj = this;
        $(this.selector).each(function(){
            obj.handle(this);
        });
    },

    getSectionMax: function (section)
    {
        return Qs_Array.get(this.sectionOptions, section + '[max]', this.defaultSectionMax);
    },

    getCategoryTitle: function (name)
    {
        return Qs_Array.get(this.categories, name + '[title]', '');
    },

    hasCategory: function (name)
    {
        return typeof this.categories[name] != 'undefined';
    },

    handle: function (node)
    {
        if (!node || !node.tagName || node.tagName != 'INPUT') {
            this.error('Invalid Node:' + node);
            return false;
        }
        var idNode = $(node).attr('id');
        var newSearchQueryId = 'new-search-query';
        if (newSearchQueryId == idNode) {
            $('select, input:text, input:checkbox', node.form).click(function(){
                this.form._activeElement = this;
            });
            $(node.form).submit(function() {
                if (this._activeElement && $(this._activeElement).attr('id') == newSearchQueryId) {
                    appSearch.newSearchBtnOnClick();
                    return false;
                }
                return true;
            });
        }
        this.autocompleteOptions.setValue = function (row) {
            return true;
        }
        var self = this;
        this.autocompleteOptions.ajaxOptions = {
            beforeSend: function (XMLHttpRequest, settings) {
                self.showLoadingAnimation(node);
            },
            complete: function (XMLHttpRequest, textStatus)
            {
                self.hideLoadingAnimation(node);
            }
        }
        this.autocompleteOptions.renderPopupItem = function (items, index, html, list) {
            var attribs = {
                'class': index%2 == 0 ? 'ac_even' : 'ac_odd'
            };
            var parts = items[index].data[1].split('-', 1);
            var type = array_shift(parts);
            attribs['class'] += ' ' + type;
            if (typeof items[index - 1] != 'undefined') {
                var prevItem = items[index - 1];
                parts = prevItem.data[1].split('-', 1);
                var prevType = array_shift(parts);
                if (prevType != type) {
                    if (self.hasCategory(prevType) && self._countSectionItems >= self.getSectionMax(prevType)) {
                        var liAll = $('<li/>').text('Show all ' + self.getCategoryTitle(prevType)).click(function(){
                            var prevLi = this;
                            while (prevLi = getPreviousTag(prevLi, 'LI')) {
                                $(prevLi).show();
                                if ($(prevLi).hasClass('ps_popup_item_separator')) {
                                    break;
                                }
                            };
                            $(this).remove();
                        });
                        list.append(liAll);
                    }
                    self._countSectionItems = 0;
                    attribs['class'] += ' ps_popup_item_separator';
                } else {
                    self._countSectionItems++;
                }
                if (self._countSectionItems >= self.getSectionMax(type)) {
                    attribs['style'] = 'display:none';
                }
            }
            var li = $("<li/>").html(html).attr(attribs);
            return li;
        }
        $(node).autocomplete(
            BASE_URL_REAL + '/' + this.adapterAlias,
            this.autocompleteOptions
        ).result(function(event, data, formatted) {
            var title = array_shift(data);
            var value = array_shift(data);
            var parts = value.split('-', 2);
            var type = '';
            var query = '';
            var pos;
            if (-1 !== (pos = value.indexOf('-'))) {
                type  = value.substr(0, pos);
                query = value.substr(pos + 1);
            }
            self.popupItemOnClick(type, query, node);
        });
    },

    setOptions: function (options)
    {
        for (var name in options) {
            this[name] = options[name];
        }
    },

    error: function(text)
    {
        alert('Product Search: ' + text);
    },

    popupItemOnClick: function(type, query, node)
    {
        var redirectUrl = BASE_URL_REAL + '/' + this.searchAlias + '?';
        var params = {};
        switch (type) {
            case 'name':
                // the break was intentionally  omitted
            case 'query':
                params.q = query;
                break;
            case 'id':
                params.id = query;
                break;
            case 'cross_reference':
                params.cross_reference = query;
                break;
            case 'make':
                params.maker_id = query;
                break;
            case 'category':
                params.category_id = query;
                params.pref_separate = 'separate';
                break;
            case 'subcategory':
                params.subset_id = query;
                break;
            default:
                break;
        }
        params.subm = 'Search';
        for (var name in params) {
            redirectUrl += name + '=' + encodeURIComponent(params[name]) + '&';
        }
        redirectUrl = rtrim(redirectUrl, '&');
        showProgress();
        setTimeout("document.location = '" + addslashes(redirectUrl) + "';", 1000);
    },

    showLoadingAnimation: function (input)
    {
        $(input).addClass('ps_input_loading');
    },

    hideLoadingAnimation: function (input)
    {
        $(input).removeClass('ps_input_loading');
    },

    makeOnChange: function (element)
    {
        return this.reloadSelects(element.form, 'maker_id');
    },

    categoryOnChange: function (element)
    {
        return this.reloadSelects(element.form, 'category_id');
    },

    subCategoryOnChange: function (element)
    {
        return this.reloadSelects(element.form, 'subset_id');
    },

    reloadSelects: function (form, elementName)
    {
        $('input[name=q]', form).val('');
        var request = {
            action : 'reloadSelects',
            name   : elementName
        }
        var elements = ['maker_id', 'category_id', 'subset_id'];
        var data = Qs_Form.toObject(form);
        for (var i in elements) {
            var name = elements[i];
            var domName = name + '[]';
            var element = form[domName];
            request[name] = data[domName] || '';
            if (name != elementName) {
                element.disabled = true;
            }
        }
        var self = this;
        $.ajax({
            url     : BASE_URL_REAL + '/' + this.adapterAlias,
            type    : 'POST',
            dataType: 'json',
            data    : request,
            success : function (response)
            {
                if (response.success) {
                    self.updateSelects(form, response.options);
                }
            }
        });
        return false;
    },

    updateSelects: function (form, options)
    {
        var elements = ['maker_id', 'category_id', 'subset_id'];
        for (var i in elements) {
            var name = elements[i];
            var domName = name + '[]';
            var element = form[domName];
            if (typeof options[name] !== 'undefined') {
                var elementOptions = options[name];
                var emptyTitle = $('option:first', element).text();
                var oldValue = Form_Element_Select.getValue(element);
                element.disabled = false;
                Form_Element_Select.setOptions(element, elementOptions, emptyTitle);
                var cnt = 0;
                for (var i in elementOptions) {
                    cnt++;
                }
                if (cnt == 1) {
                    var value;
                    if (Qs_Array.isAssoc(elementOptions)) {
                        value = array_key(elementOptions);
                    } else {
                        var firstOption = array_shift(elementOptions);
                        value = firstOption.value;
                    }
                    Form_Element_Select.setValue(element, value);
                } else {
                    Form_Element_Select.setValue(element, oldValue);
                }
            }
        }
    },

    formOnReset: function (form)
    {
        var elements = ['maker_id', 'category_id', 'subset_id'];
        for (var i in elements) {
            var name = elements[i];
            form[name].value = '';
        }
        appSearch.reloadSelects(form);
        return false;
    },

    newSearchBtnOnClick: function ()
    {
        var redirectUrl = BASE_URL_REAL + '/' + appSearch.searchAlias + '?q='
                        + encodeURIComponent($('#new-search-query').val()) ;
        showProgress();
        setTimeout("document.location = '" + addslashes(redirectUrl) + "';", 1000);
        return true;
    },

    newSearchBtnOnFocus: function ()
    {
        $('#btn-reload-search-results').css('visibility', 'hidden');
        $('#btn-new-search').css('visibility', 'visible');
    },

    newSearchBtnOnBlur: function ()
    {
        setTimeout('appSearch.newSearchBtnOnBlurTimeout()', 500);
    },

    newSearchBtnOnBlurTimeout: function ()
    {
        $('#btn-reload-search-results').css('visibility', 'visible');
        $('#btn-new-search').css('visibility', 'hidden');
    }
}


var App_Product_Lookup = Class.create();
var appLookup = null;
App_Product_Lookup.prototype = {};
$.extend(
    App_Product_Lookup.prototype,
    App_Product_Search.prototype,
    {
        popupItemOnClick: function(type, query, node)
        {
            var redirectUrl = BASE_URL_REAL + '/' + this.searchAlias + '?';
            var params = {};
            switch (type) {
                case 'query':
                    params.q = query;
                    break;
                case 'name':
                    // the break was intentionally  omitted
                case 'lookup_text':
                case 'lookup':
                    $(node).flushCache();
                    showProgress();
                    setTimeout("loadProduct('" + addslashes(query) + "', 'lookup');", 1000);
                    return true;
                case 'id':
                    $(node).flushCache();
                    showProgress();
                    setTimeout("loadProduct('" + addslashes(query) + "', 'id');", 1000);
                    return true;
                case 'cross_reference':
                    $(node).flushCache();
                    showProgress();
                    setTimeout("loadProduct('" + addslashes(query) + "', 'cross-reference');", 1000);
                    return true;

                    break;
                case 'make':
                    params.maker_id = query;
                    break;
                case 'category':
                    params.category_id = query;
                    params.pref_separate = 'separate';
                    break;
                case 'subcategory':
                    params.subset_id = query;
                    break;
                default:
                    break;
            }
            params.subm = 'Search';
            for (var name in params) {
                redirectUrl += name + '=' + encodeURIComponent(params[name]) + '&';
            }
            redirectUrl = rtrim(redirectUrl, '&');
            showProgress();
            setTimeout("document.location = '" + addslashes(redirectUrl) + "';", 1000);
        },

        lookup: function (query)
        {
            loadProduct(query, 'lookup');
            this.flushCache();
        },

        flushCache: function ()
        {
            $(this.selector).each(function(){
                $(this).flushCache();
            });
        }
    }
);

