(function($) {
    $.fn.buildForms = function(settings) {
        return $.buildForms(this, settings);
    };
    
    var global = {},
        globalSettings = {};
    
    var documentClickHandler = function() {
        if (global.selectOpen) {
            $.buildForms.hideSelect(global.selectOpen);
        }
    };
    
    $.buildForms = function(container, settings) {
        var options = {
            'sepChar': '@',
            'preFieldNameL': 'Filter[',
            'preFieldNameR': ']',
            'preHiddenName': 'fidden-f-',
            'formId': $(container).attr('id'),
            'ulMaxHeight': 180,
            'cacheElements': [],
            'checkArrayVal': [],
            'isFixedW': 0,
            'checkStartVal': {}
        };
        
        var content = '';
        
        if (settings.fields.length > 0) {
            $.extend(settings, options);
            
            var sumCount = settings.fields.length + settings.advancedFields.length,
                aLength = sumCount - settings.advancedFields.length,
                advancedLength = settings.advancedFields.length,
                tmp = 1;
            
            settings.fields = settings.fields.concat(settings.advancedFields);
            
            $.each(settings.fields, function(i) {
                if (tmp && advancedLength > 0 && i > aLength - 1) {
                    content += '<div class="sep"></div><div class="detail-filter-link"><div class="clear"></div><a href="#" onclick="$(\'#advanced-form\').toggle(); $.buildForms.stopEvent(event);">Расширенные параметры</a></div><div id="advanced-form" class="j-full-filter-form ' + (settings.isAdvancedFields ? '' : 'hidden') + '">';
                    tmp = 0;
                }
                content += $.buildForms.build(this.type, this, settings);
            });
            
            if (advancedLength > 0) {
                content += '</div>';
            }
            
            if (settings.isAutoSubmit == 0) {
                content += '<div class="sep"></div><input class="button filter-work" type="submit" name="" value="Применить фильтр" />';
            }
            $(container).removeClass('no-js').html(content);
            globalSettings = settings;
        }
    };
    
    $.buildForms.build = function(type, obj, settings) {
        var html = '',
            li   = '',
            cur  = '',
            val = '';
        
        obj.open = 0;
        
        switch(type) {
            case 'select':
                for (var i = 0; i < obj.values.length; i++) {
                    var tmp = obj.values[i].split(settings.sepChar);
                    li += '<li id="' + tmp[0] + '"' + (obj.active == tmp[0] ? 'class="a" active="1" ' : 'active="0"') + ' onclick="$.buildForms.selectClick(this, event);" onmouseover="$.buildForms.selectOver(this); return false;" onmouseout="$.buildForms.selectOut(this); return false;"><span>' + tmp[1] + '</span></li>';
                    
                    if (obj.active == tmp[0]) {
                        cur = tmp[1];
                        val = tmp[0];
                    }
                }
                
                html  = '<div class="select-box"><label for="' + obj.id + '">' + obj.title + ':</label><div id="' + obj.id + '" class="select-area" onclick="$.buildForms.selectToggle(this, event);" onmouseover="$(this).addClass(\'hover\'); return false;" onmouseout="$(this).removeClass(\'hover\'); return false;">';
                html += '<div class="result">' + cur + '<div class="drop-d"></div></div>';
                html += '<ul class="hidden">';
                html += li;
                html += '</ul>';
                html += '</div></div>';
                html += '<input type="hidden" name="' + settings.preFieldNameL + obj.id + settings.preFieldNameR + '" value="' + (val > 0 ? val : '') + '" id="' + settings.preHiddenName + obj.id + '" />';
            break;
            case 'checkbox':
                settings.checkArrayVal[obj.id] = [];
                
                html  = '<div class="check-box"><label for="' + obj.id + '">' + obj.title + ':</label><div id="' + obj.id + '" class="check-area">';
                html += '<ul class="show">';
                for (var i = 0; i < obj.values.length; i++) {
                    var tmp = obj.values[i].split(settings.sepChar);
                    var check = '';
                    for (var j = 0; j < obj.active.length; j++) {
                        if (obj.active[j] == tmp[0]) {
                            settings.checkArrayVal[obj.id].push(tmp[0]);
                            check = 'class="check" check="1"';
                            
                            break;
                        } else {
                            check = 'check="0"';
                        }
                    }
                    html += '<li id="' + tmp[0] + '"' + check + ' onclick="$.buildForms.checkClick(this, event);">' + tmp[1] + '</li>';
                }
                html += '</ul>';
                html += '</div></div>';
                html += '<input type="hidden" name="' + settings.preFieldNameL + obj.id + settings.preFieldNameR + '" value="' + settings.checkArrayVal[obj.id].join(':') + '" id="' + settings.preHiddenName + obj.id + '" />';
            break;
            case 'fromto':
                html  = '<div class="from-to-box"><label for="' + obj.id + '">' + obj.title + ':</label>';
                html += obj.values[0] + ' <input type="text" name="' + settings.preFieldNameL + obj.id + settings.preFieldNameR + '[LEFT]" maxlength="6" value="' + (obj.active[0] > 0 ? obj.active[0] : '') + '" />&nbsp;&nbsp;&nbsp;';
                html += obj.values[1] + ' <input type="text" name="' + settings.preFieldNameL + obj.id + settings.preFieldNameR + '[RIGHT]" maxlength="6" value="' + (obj.active[1] > 0 ? obj.active[1] : '') + '" />';
                html += '</div>';
            break;
            default:
                alert('Undefined attribute "type" in the row with the id = ' + obj.id);
            break;
        }
        
        return html;
    };
    
    $.buildForms.setActiveClass = function(container) {
        $(container).find('li[active=1]').addClass('a');
    };
    
    $.buildForms.unsetActiveClass = function(container) {
        $(container).find('li').removeClass('a');
    };
    
    $.buildForms.unsetActiveAttr = function(container) {
        $(container).find('li').attr('active', 0);
    };
    
    $.buildForms.getMaxLiWidth = function(container) {
        var w = 0, h = 0, tmp = 0;
        var cont = $(container),
            contW = cont.width(),
            ul = cont.find('ul'),
            elem = ul.find('span'),
            wW = $(window).width();
        
        cont.find('li:nth-child(even)').addClass('cc');
        ul.attr('style', 'display:block;left:-10000px;top:-10000px;width:auto;');
        
        elem.each(function(i){
            if ($(this).width() > w) {
                w = $(this).width();
            }
            
            h += $(this).height() + 4;
        });
        
        var css  = 'height:' + (h > globalSettings.ulMaxHeight ? globalSettings.ulMaxHeight + 'px' : 'auto') + ';' + (wW - container.offsetLeft < w ? 'right:-1px;left:auto;' : '');
            css += (globalSettings.isFixedW == 0 ? ('width:' + (w > contW ? (w + 30) + 'px' : '100%')) : '');
        ul.attr('style', css);
    };
    
    $.buildForms.selectToggle = function(container, e) {
        $.buildForms.stopEvent(e);
        (container.open ? $.buildForms.hideSelect(container) : $.buildForms.showSelect(container));
    };
    
    $.buildForms.showSelect = function(container) {
        if (global.selectOpen) {
            $.buildForms.hideSelect(global.selectOpen);
        }
        
        container.open = 1;
        global.selectOpen = container;
        
        if ($.inArray(container.id, globalSettings.cacheElements) == -1) {
            globalSettings.cacheElements.push(container.id);
            $.buildForms.getMaxLiWidth(container);
        }
        
        $(container).css({'z-index': '1000'}).addClass('click-hover').find('ul').css('border-color', '#353535').removeClass('hidden').scrollTo('li.a', 400);
        
        $(document).one('click', documentClickHandler);
    };
    
    $.buildForms.hideSelect = function(container) {
        if (container.open) {
            container.open = 0;
            global = {};
            
            $(container).css({'z-index': ''}).removeClass('click-hover').find('ul').addClass('hidden');
            $.buildForms.setActiveClass(container);
        }
    };
    
    $.buildForms.selectOver = function(container) {
        $(container).addClass('hover');
        $.buildForms.unsetActiveClass(container.parentNode);
    };
    
    $.buildForms.selectOut = function(container) {
        $(container).removeClass('hover');
    };
    
    $.buildForms.selectClick = function(container, e) {
        $.buildForms.stopEvent(e);
        $.buildForms.unsetActiveAttr(container.parentNode);
        container.active = 1;
        
        $(container.parentNode.previousSibling).html('<nobr>' + $(container).text() + '</nobr><div class="drop-d"></div>');
        
        var parentDiv = container.parentNode.parentNode;
        $.buildForms.hideSelect(parentDiv);
        
        $('#' + globalSettings.preHiddenName + parentDiv.id).val(container.id);
        
        if (globalSettings.isAutoSubmit == 1) {
            $('#' + globalSettings.formId).submit();
        }
    };
    
    $.buildForms.checkClick = function(container, e) {
        $.buildForms.stopEvent(e);
        
        var id = container.id,
            parentDiv = container.parentNode.parentNode,
            parentDivId = parentDiv.id,
            parentUl = container.parentNode,
            check = $(container).attr('check');
        
        if (check == 0) {
            container.check = 1;
            $(container).addClass('check');
            
            globalSettings.checkArrayVal[parentDivId].push(id);
        } else {
            container.check = 0;
            $(container).removeClass('check');
            
            var pos = $.inArray(id, globalSettings.checkArrayVal[parentDivId]);
            
            if (pos >= 0) {
                globalSettings.checkArrayVal[parentDivId].splice(pos, 1);
            }
        }
        //alert(globalSettings.checkArrayVal[parentDivId].join(':'));
        $('#' + globalSettings.preHiddenName + parentDiv.id).val(globalSettings.checkArrayVal[parentDivId].join(':'));
    };
    
    $.buildForms.stopEvent = function(e) { 
        var e = e || window.event;
        
        if (e.preventDefault) {
            e.preventDefault();
        }
        e.returnValue = false;
        
        if (e.stopPropagation) {
            e.stopPropagation();
        }
        e.cancelBubble = true;
    };
})(jQuery);
