var order_form = {
    container: null,
    items: null,
    pseudo_select: null,
    last_selected: null,

    init: function() {
        if(!document.getElementById || !document.getElementsByClassName || !document.getElementsByTagName || !document.createElement || !document.createTextNode) return;

        var bd = document.getElementsByTagName('body')[0];
        if(bd.className.indexOf('has_JS') == -1) { bd.className += ' has_JS';}

        this.container = $('order_form');
        if(!this.container) return;

        this.select_element = this.container.select('select')[0];
        if(!this.select_element) return;

        this.pseudo_select = document.createElement('ul');
        this.pseudo_select.setAttribute('id', 'pseudo-select');
        this.pseudo_select.className += ' closed';

        this.items = this.select_element.getElementsByTagName('*');
        var il = this.items.length;



        for (var i = 0; i < il; i++) {
            var current_item = this.items[i];
            if(current_item.nodeName.toLowerCase() == 'option') {
                var li = document.createElement('li');
                    li.className = 'pseudo-option';
                var a = document.createElement('a');
                    a.setAttribute('href', '#');
                var txt = current_item.innerHTML;
                if(i != 0) {
                    txt = txt.replace('/', '');
                    var txt_array = txt.split(' ');

                    var no_txt = document.createTextNode(txt_array[0]);
                    var no_span = document.createElement('span');
                        no_span.appendChild(no_txt);
                        a.appendChild(no_span);

                    txt_array.shift();
                    txt = txt_array.join(' ');
                }

                var txt = document.createTextNode(txt);
                    a.appendChild(txt);
                    li.appendChild(a);

                    if(current_item.selected) {
                        li.className += ' active';
                    }

                    this.pseudo_select.appendChild(li);
                    Event.observe(a, 'click', this.clickListener.bindAsEventListener(this), false);
                    Event.observe(a, 'mouseover', this.mouseoverListener.bindAsEventListener(this), false);
            } else if(current_item.nodeName.toLowerCase() == 'optgroup') {

                var li = document.createElement('li');
                    li.className = 'pseudo-optgroup';
                var strong = document.createElement('strong');
                var txt = document.createTextNode(current_item.getAttribute('label'));
                    strong.appendChild(txt);
                    li.appendChild(strong);
                    this.pseudo_select.appendChild(li);

            }
            if(current_item == this.items[0]) {
                li.className += ' first-child';
            }
            if(current_item == this.items[this.items.length-1]) {
                li.className += ' last-child';
            }

            this.select_element.parentNode.appendChild(this.pseudo_select);

            this.last_selected = this.select_element.selectedIndex;
        }
        
        var li_items = $(this.pseudo_select).select('.pseudo-option');
            first_item = li_items[0];
            first_item.className += ' active';

        for(var i = 1; i<li_items.length; i++){
            
            if(li_items[i].className.indexOf('active') != -1){
                first_item.className = first_item.className.replace(/active/, '');
            }
            
        }

        Event.observe(bd, 'click', this.bodyListener.bindAsEventListener(this), false);

    },


    clickListener: function(e) {

        if(window.event) {
            window.event.returnValue = false;
        } else {
            e.preventDefault();
        }

        var event_target =  window.event ? window.event.srcElement : e.target;
        if(event_target.nodeName.toLowerCase() == 'img') {
            event_target = event_target.parentNode;
        }
        this.toggle(event_target);
    },

    bodyListener: function(e) {

        var event_target =  window.event ? window.event.srcElement : e.target;
        if(event_target.nodeName.toLowerCase() == 'img') {
            event_target = event_target.parentNode;
        }

        var related_ul = this.getParentByNodeName(event_target, 'ul');
        if(!related_ul && this.pseudo_select.className.indexOf('opened') != -1) {
            var li_items = $(this.pseudo_select).select('.pseudo-option');
            var last_selected_li = li_items[this.last_selected];
            this.toggle(last_selected_li)
        }

    },

    toggle: function(event_target) {

        var related_li = this.getParentByNodeName(event_target, 'li');
        if(!related_li) return;
        var li_items = $(this.pseudo_select).select('.pseudo-option');

        var item_index = this.getItemPosition(related_li);

        if(this.pseudo_select.className.indexOf('opened') != -1) {
            this.pseudo_select.className = this.pseudo_select.className.replace(/opened/, 'closed');
        } else {
            this.pseudo_select.className = this.pseudo_select.className.replace(/closed/, 'opened');
        }

        if(item_index != this.last_selected) {
            var last_item = li_items[this.last_selected];
            last_item.className = last_item.className.replace(/active/, '');
            related_li.className += ' active';

            this.last_selected = item_index;
            this.select_element.options[item_index].selected = 'selected';
        }

        if(typeof form_validator == 'object') {
            form_validator.validate();
        }

    },

    mouseoverListener: function(e) {

        if(window.event) {
            window.event.returnValue = false;
        } else {
            e.preventDefault();
        }

        var event_target =  window.event ? window.event.srcElement : e.target;
        if(event_target.nodeName.toLowerCase() == 'img') {
            event_target = event_target.parentNode;
        }
    },

    getItemPosition: function(related_li) {

        var li_items = this.pseudo_select.select('.pseudo-option');

        var il = li_items.length;
        for(var i = 0; i < il; i++) {
            var current_section = li_items[i];
            if(current_section == related_li) {
                var position = i;
            }
        }
        return position;
    },

    getParentByNodeName: function(obj, nodeName) {

        while(obj.nodeName.toLowerCase() != nodeName) {
            obj = obj.parentNode;

            if(obj.nodeName.toLowerCase() == 'html') {
                obj = null;
                break;
            }
        }

        return obj;
    }

}