(function($) {
var danSearch;

$.fn.extend({
    danSearch: function(resultCnt) {
        return this.each(function() {
            danSearch = new Search(this, resultCnt);
        });
    }
});

var Search = window._DanSearch = function(form, resultCnt) {
    var self = this;
    this.isStatic = (form == null);
    if (!this.isStatic) {
        this.$form = $(form);
        this.startup();
    }
    this.resultCnt = resultCnt;
}

Search.prototype =  {
    startup: function() {
        var self = this;
//        if (window.__useTermsForSearch)
            $.post('/ajax/', { iface: 'estate_search_by_terms' }, function(data) { self.drawResult(data); }, 'xml');
        this.drawTable();
        this.getField();
        this.$form.submit(function() {
            self.submit();
            return false;
        });
    },
    getField: function(ctx) {
        var self = this;
        var options = {
            iface: 'estate_select'
        };
        if (ctx) {
            var s = ctx.options[ctx.selectedIndex].id;
            if (s.match(/o(\d+)/)) {
                options['ctx_id'] = RegExp.$1;
            }
        }
        _showLoader();
        $.post('/ajax/', options, function(data) { self.parseResponse(data, ctx); }, 'xml');
    },
    parseResponse: function(data, ctx) {
        _hideLoader();
        var fields = data.getElementsByTagName('field');
        var self = this;
        if (ctx) this.removeOld(ctx.id);
        for (var i=0; i<fields.length; i++) {
            var caption = fields[i].getAttribute('caption');
            var name = fields[i].getAttribute('name');
            var id = fields[i].getAttribute('id');
            var type = fields[i].getAttribute('type');
            var _value = fields[i].getAttribute('value');
            var $row = $el('tr').attr('id', 'r' + id);
            if (ctx) {
                $row.attr('ctx_id', ctx.id);
            }
            $row.append($el('td').html('<h3>'+caption+'</h3>'));
            var $ap = $el('td');
            var $s;
            $row.append($ap);
            if (type == 'select') {
                $s = $el('select')
                        .attr({
                            'name': name,
                            'id': 's' + id
                        })
                        .bind('change', function() { self.getField(this); });
                $ap.append($s);
                $ap = $s;
            }
            var options = fields[i].getElementsByTagName('option');
            var _values = ((_value != null) && (type == 'check')) ? _value.split(',') : [];
            for (var j=0; j<options.length; j++) {
                switch(type) {
                    case 'select':
                        var selected = (_value == options[j].getAttribute('value')) ? 'selected' : undefined;
                        $el('option')
                            .attr({
                                'value': options[j].getAttribute('value'),
                                'id': 'o' + options[j].getAttribute('id'),
                                'selected': selected
                            })
                            .html(options[j].getAttribute('caption'))
                            .appendTo($ap);
                    break;
                    case 'check':
                        var flag = false;
                        if (_values.length < options.length)
                            for (var k=0; (k<_values.length) && (!flag); k++)
                                if (options[j].getAttribute('value') == _values[k])
                                    flag = true;
                        var checked = (flag) ? 'checked' : undefined;
                        $el('label')
                            .html(options[j].getAttribute('caption'))
                            .prepend(
                                $el('input')
                                    .attr({
                                        'type': 'checkbox',
                                        'name': name,
                                        'value': options[j].getAttribute('value'),
                                        'checked': checked
                                    })
                            )
                            .appendTo($ap);
                    break;
                    case 'radio':
                        var checked = (_value == options[j].getAttribute('value')) ? 'checked' : undefined;
                        $el('label')
                            .html(options[j].getAttribute('caption'))
                            .prepend(
                                $el('input')
                                    .attr({
                                        'type': 'radio',
                                        'name': name,
                                        'value': options[j].getAttribute('value'),
                                        'checked': checked
                                    })
                            )
                            .appendTo($ap);
                    break;
                }
            }
            if (ctx) {
                var f = ctx;
                while ((f = f.parentNode) && (f.tagName.toLowerCase() != 'tr'));
                if (f.nextSibling) {
                    $row.insertBefore('#'+f.nextSibling.id);
                }
            } else {
                this.$table.append($row);
            }
            if (type == 'select') {
                this.getField($s.get(0));
            }
        }
        if (!ctx) {
            $el('tr')
                .attr('id', 'rdsubmit')
                .html('<td class="submit" colspan="2"><input type="submit" value="Искать" /></td>')
                .appendTo(this.$table);
        }
    },
    submit: function(params) {
        var self = this;
        var options = {
            iface: 'estate_search'
        };
        _showLoader();
        if (!this.isStatic) {
            var elements = this.$form.get(0).elements;
            for (var i=0; i<elements.length; i++) {
                if ((elements[i].name) && ((elements[i].type != 'checkbox') || (elements[i].checked))) {
                    if (options['_ds_'+elements[i].name]) options['_ds_'+elements[i].name] += ','+elements[i].value;
                    else options['_ds_'+elements[i].name] = elements[i].value;
                }
            }
        } else {
            for (var param in params)
                options['_ds_'+param] = params[param];
        }
        $.post('/ajax/', options, function(data) { self.drawResult(data); }, 'xml');
    },
    drawResult: function(data) {
        var html = data.getElementsByTagName('html')[0];
        if (html) {
            $(this.resultCnt).html(html.text || html.textContent || html.firstChild.nodeValue);
            $('table.estates td div')
                .hover(
                    function() {
                        $(this).addClass('hover');
                    },
                    function() {
                        $(this).removeClass('hover');
                    }
                )
                .click(
                    function() {
                        window.location = $(this).find('a').get(0).href;
                    }
                );
        }
        _hideLoader();
    },
    drawTable: function() {
        this.$table = $el('tbody');
        this.$form.append($el('table').append(this.$table));
    },
    removeOld: function(ctxId) {
        var self = this;
        this.$table.find('tr').each(function() {
            if (this.getAttribute('ctx_id') == ctxId) {
                var s = this.getElementsByTagName('select')[0];
                if (s) self.removeOld(s.id);
                $(this).remove();
            }
        });
    }
}

var $el = function(tag) {
    return $(document.createElement(tag));
}

})(jQuery);

