AdvManager = function() {
    bindMethods(this);
}

MochiKit.Base.update(AdvManager.prototype, {
    initialize: function() {
        this.type_autocompleter = new AutoComplete.Remote('id_type', 'autocompleter_choices', '/services/products/', 
            {'minChars':1, 'css':'/media/css/autocomplete.css', 'updateElement':'addItemToList', 'input_class':'vTextField', 'method':'get_types' });
        this.type_autocompleter.initialize()
    
        this.name_autocompleter = new AutoComplete.Remote('id_name', 'autocompleter_choices', '/services/products/', 
            {'minChars':1, 'css':'/media/css/autocomplete.css', 'updateElement':'addItemToList', 'input_class':'vLongTextField vTextField', 'method':'get_names' });
        this.name_autocompleter.initialize()    
        this.servicesproxy = new JsonRpcProxy('http://' + location.host + '/services/products/', ['get_by_id', 'get_filtered_set']);
        connect('search', 'onclick', this, 'GetResults');
        connect('add_constraint', 'onclick', this, 'BuildConstraint');
        connect('param0', 'onchange', this, 'SetSelected');
        connect('unit0', 'onchange', this, 'SetSelected');
        connect('op0', 'onchange', this, 'SetSelected');
        connect('id_value', 'onblur', this, 'SetValue');
        this.pcount = 0;
    },
    SetValue: function(e) {
        setNodeAttribute(e.src(), 'value', e.src().value); 
    },
    SetSelected: function(e) {
        for(var i = 0; i < e.src().options.length; i++) {
            if( getNodeAttribute(e.src().options[i], 'selected') != null ) {
                var att_node = document.createAttribute('selected');
                e.src().options[i].removeAttributeNode(att_node);
            }
        }
        setNodeAttribute(e.src().options[e.src().selectedIndex], 'selected', 'selected');
    },
    BuildConstraint: function(e) {
        log('in build');
        this.pcount += 1;
        var res = TrimPath.processDOMTemplate('param_filter_template', { 'pcount':this.pcount });
        $('filter_div').innerHTML += res;
        connect('del_constraint' + this.pcount, 'onclick', this, 'RemoveConstraint');
        connect('lop' + this.pcount, 'onchange', this, 'SetSelected');
        connect('param' + this.pcount, 'onchange', this, 'SetSelected');
        connect('unit' + this.pcount, 'onchange', this, 'SetSelected');
        connect('op' + this.pcount, 'onchange', this, 'SetSelected');
        connect('id_value' + this.pcount, 'onblur', this, 'SetValue');
    },
    RemoveConstraint: function(e) {
        disconnectAll(e.src());
        var ul = getFirstParentByTagAndClassName(e.src(), 'ul');
        removeElement(ul);
    },
    GetResults: function(e) {
        var def = null;
        if($('id_value').value != "") {
            //Have filters set
            var query_set = [];
            var lists = getElementsByTagAndClassName('ul', null, $('filter_div'));
            for(var i = 0; i < lists.length; i++) {
                var selects = getElementsByTagAndClassName('select', null, lists[i]);
                var value = getFirstElementByTagAndClassName('input', 'vTextField', lists[i]);
                if(selects.length == 3) {
                    var param = selects[0].options[selects[0].selectedIndex].value;
                    var op = selects[1].options[selects[1].selectedIndex].value; 
                    var unit = selects[2].options[selects[2].selectedIndex].value; 
                    query_set[query_set.length] = { 'param':param, 'op':op, 'value':value.value, 'unit':unit }; 
                } else {
                    query_set[query_set.length] = selects[0].options[selects[0].selectedIndex].value;
                    var param = selects[1].options[selects[1].selectedIndex].value;
                    var op = selects[2].options[selects[2].selectedIndex].value; 
                    var unit = selects[3].options[selects[3].selectedIndex].value; 
                    query_set[query_set.length] = { 'param':param, 'op':op, 'value':value.value, 'unit':unit };
                }
            }
            var def = this.servicesproxy.get_filtered_set(query_set);
        } else if($('type').value != "" || $('name').value != "" ) {
            var id = ($('type').value != "") ? $('type').value : $('name').value;
            var def = this.servicesproxy.get_by_id(id);
        }
        def.addCallback(this.ShowResult);
        def.addErrback(this.DisplayError);
    },

    ShowResult: function(resp) {
        var div = DIV({'id':'results'}, H3({}, 'Search Results:')); 
        for(var i = 0; i < resp.length; i++) {
            appendChildNodes(div, P({}, A({'href':resp[i].url}, resp[i].type), BR({}), resp[i].name)) 
        }
        if($('results')) {
            swapDOM('results', div);
        } else {
            insertSiblingNodesAfter('advsearch_form', div);
        }
    },

    DisplayError: function(err) {
        if($('results')) {
            swapDOM('results', DIV({'id':'results'}, P({}, SPAN({'style':'color: red;'}, 'No Results Found'))));
        } else {
            insertSiblingNodesAfter('advsearch_form', DIV({'id':'results'}, H3({}, 'Search Results:'), P({}, SPAN({'style':'color: red;'}, 'No Results Found'))));
        }
    }
});
advManager = new AdvManager();
addLoadEvent(advManager.initialize);
