// Copyright (c) 2006 - 2008 Gabriel Lanzani (http://www.glanzani.com.ar)
// 
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
// SEE CHANGELOG FOR A COMPLETE CHANGES OVERVIEW
// VERSION 0.4

Autocompleter.SelectBox = Class.create();
Autocompleter.SelectBox.prototype = Object.extend(new Autocompleter.Base(), {
    initialize: function(select, options) {
        this.element = "<input type=\"text\" id=\"" + $(select).id + "_combo\" />"
        new Insertion.Before(select, this.element)
        var inputClasses = Element.classNames(select);
        this.count = -1;
        this.update = "<div id=\"" + $(select).id + "_options\" class=\"" + inputClasses + "\"></div>"
        new Insertion.Before(select, this.update)

        this.baseInitialize($(select).id + "_combo", $(select).id + "_options", options);
        this.select = select;
        this.selectOptions = [];

        $(this.element.id).setAttribute('readonly', 'readonly');
        this.element.readOnly = true;

        if (this.options.debug) var debugText = 'Debug input ' + this.element.id + ' and div ' + this.update.id + ' created, Autocompleter.Base() initialized\r\n';
        if (!this.options.debug) Element.hide(select);
        Element.addClassName(this.element.id, this.options.css);

        var optionList = $(this.select).getElementsByTagName('option');
        var nodes = $A(optionList);

        for (i = 0; i < nodes.length; i++) {
            this.selectOptions.push("<li id=\"" + nodes[i].value + "\">" + nodes[i].innerHTML + '</li>');
            if (nodes[i].getAttribute("selected")) this.element.value = nodes[i].innerHTML;

            if (this.options.debug) debugText += 'option ' + nodes[i].value + ' added to ' + this.update.id + "\r\n";
        }

        Event.observe(this.element, "click", (function() { if (!Element.visible(this.update)) { this.activate.bindAsEventListener(this)() } else {this.hide()  } }).bind(this));

        if ($(select).selectedIndex >= 0) this.element.value = $(select).options[$(select).selectedIndex].innerHTML.replace(/&amp;/, "&");
        var self = this;

        this.options.afterUpdateElement = function(text, li) {
            var optionList = $(select).getElementsByTagName('option');
            var nodes = $A(optionList);

            var opt = nodes.find(function(node) {
                return (node.value.toLowerCase() == li.id.toLowerCase());
            });

            $(select).selectedIndex = opt.index;

            if (self.options.redirect) document.location.href = opt.value;
            if (self.options.submit != '') $(self.options.submit).submit();
        }

        if (this.options.debug) alert(debugText);
    },

    getUpdatedChoices: function() {
        this.updateChoices(this.setValues());
    },

    setValues: function() {
        return ("<ul>" + this.selectOptions.join('') + "</ul>");
    },

    setOptions: function(options) {
        this.options = Object.extend({
            //MORE OPTIONS TO EXTEND THIS CLASS
            submit: false, //form Id to submit after change 
            redirect: false, // redirects to option value
            debug: false, //show alerts with information
            css: 'combo'	 //css class for new element 
        }, options || {});
    }
})
