/** Selectbox.js
*
* Changes the normal system default <input type="select"></select>
* to a version on divs and inputs which can by completely restyled
* in css.
*
* Requires mootools v1.2
*
* Copyright (c) by Eura7
* Author Krzysztof Antoszek
* 
*
*/
var SelectClass = new Class({
    
    initialize: function ()
    {   
    },
    
    replaceSelect: function ()
    {
        var select = $$('select.select-ui');
        
        for(var i = 0; i < select.length; i++) {
            if(typeof(select[i]) == 'object') {
                this.hideSelect(select[i]);
                this.createSelect(select[i]);
                select[i].destroy();
            }             
        }
        
    },
    
    createSelect: function (element)
    {
        this.createFields(element);
        this.createList(element);
    },
    
    createFields: function (element)
    {
        var id = element.getProperty('id');
        var input_id = 'select_'+id;
        var value_id = 'value_'+id;
        var roller_id = 'roller_'+id;
        var input = new Element('input');
        var hidden = new Element('input');
        var roller = new Element('input');
        
        hidden.setProperty('type', 'hidden');
        hidden.setProperty('id', value_id);
        hidden.setProperty('name', element.getProperty('name'));
        hidden.setProperty('value', element.getSelected().getProperty('value'));
        
        roller.setProperty('type', 'hidden');
        roller.setProperty('id', roller_id);
        roller.setProperty('value',0);
        
        input.setProperty('type', 'text');
        input.setProperty('id', input_id);
        input.setProperty('readonly','readonly');
        input.addClass('replaced-select');
        input.setProperty('value', element.getSelected().getProperty('text'));
        
        hidden.inject(element, 'after');
        roller.inject(element, 'after');
        input.inject(element, 'after');
    },
    
    createList: function (element)
    {
        var id = element.getProperty('id');
        var list_id = 'list_'+id;
        var list_container_id = 'list_container_'+id;
        var new_select = $('select_'+id);
        var input = $('select_'+id);
        var roller = $('roller_'+id);
        
        var list_container = new Element('div');
        var list = new Element('ul');
        
        list_container.setProperty('id', list_container_id);
        list_container.setProperty('class', element.getProperty('class')+'-list-container');
        this.hideSelect(list_container);
        
        list.setProperty('id', list_id);
        list.setProperty('class', element.getProperty('class')+'-list');
        
        list_container.inject(new_select);
        list.inject(list_container, 'top');
        
        var options = element.getChildren();
        
        for(var i = 0; i < options.length; i++) {
            if(typeof(options[i]) == 'object') {
                this.createOption(options[i], list, element);
            }
        }

        input.removeEvents('focus', 'blur', 'keydown');
        input.addEvents({
            'click': function () {
                if(roller.getProperty('value') == '0') {
                    list_container.setStyle('display', 'block');
                    setTimeout("document.addEvent('click', function () { if($('"+roller.getProperty('id')+"').getProperty('value') == '1') { $('"+roller.getProperty('id')+"').setProperty('value', 0);  $('"+list_container.getProperty('id')+"').setStyle('display','none'); document.removeEvents('click');} else { document.removeEvents('click'); }  });", 10);
                    roller.setProperty('value', 1);
                } else {
                    roller.setProperty('value', 0);
                    list_container.setStyle('display', 'none');
                }  
            },
            'focus': function () {
                this.addEvent('keydown', function (event) {
                    
                    var current_text = this.getProperty('value');
                    var current_value = $('value_'+id).getProperty('value');
                    var elements = list.getChildren();
                    var current_index = null;
                    var found = false;
                    
                    for(var i = 0; i < elements.length; i++) {
                        var elinks = elements[i].getChildren();
                        for(var z = 0; z < elinks.length; z++) {
                            elinks[z].removeClass('selected');
                            if(elinks[z].getProperty('text') == current_text) {
                                current_index = i;
                                found = true;
                                switch(event.key) {
                                    case 'up':
                                        if(current_index == null || current_index == 0) current_index = elements.length - 1;
                                        else current_index = current_index - 1;
                                    break;
                                    case 'down':
                                        if(current_index == null || current_index == (elements.length - 1)) current_index = 0;
                                        else current_index++;
                                    break;
                                }
                                break;
                            } else {
                                switch(event.key) {
                                    case 'up':
                                        if(current_index == null || current_index == 0) current_index = elements.length - 1;
                                    break;
                                    case 'down':
                                        if(current_index == null || current_index == (elements.length - 1)) current_index = 0;
                                    break;
                                }
                                
                            }
                        }
                        if(found) break;
                    }
                    
                    if(current_index != null) {
                        var elink = elements[current_index].getChildren();                    
                        var eval = elink[0].getProperty('rel');
                        var etext = elink[0].getProperty('text');
                        elink[0].addClass('selected');
                        this.setProperty('value', etext);
                        $('value_'+id).setProperty('value', eval);
                        if(event.key == 'enter') {
                             roller.setProperty('value', 0);
                             list_container.setStyle('display', 'none');
                             return false;
                        }
                    }
                });
            },
            'blur' : function () {
                this.removeEvents('keydown');
            }
        });
     

    },
    
    array_search: function (needle, haystack, offset)
    {
      if(!offset) offset = 0;  
      if(offset <= haystack.length) {
          for(var i = offset; i < haystack.length; i++) {
              if(haystack[i] == needle) {
                  return i;
              }
          }
      }
      return null;
    },
    
    createOption: function (element, list, select)
    {
        var option = new Element('li');
        var link = new Element('a');
        var input = $('select_'+select.getProperty('id'));
        var hidden = $('value_'+select.getProperty('id'));
        var container = list.getParent();
        var formName = 'select_'+select.getProperty('id')+'_form';
        
        link.setProperty('href', 'javascript:void(0);');
        link.setProperty('rel', element.getProperty('value'));
        link.setProperty('text', element.getProperty('text'));
        link.addEvents({
            'click': function () {
                $each(this.getParent().getParent().getChildren(), function(item) {
                    var child = item.getChildren();
                    child[0].removeClass('selected');
                    });
                input.setProperty('value', this.getProperty('text'));
                hidden.setProperty('value', this.getProperty('rel'));
                // wyslij formularz
                $(formName).submit();
                
                this.blur();
                container.setStyle('display', 'none');
                this.addClass('selected');  
                return false;
            },
            'keydown': function (event) {
                if(event.key == 'enter') {
                    this.fireEvent('click');
                }

                return false;
            }
        });
        
        option.inject(list);
        link.inject(option);
        
    },
    
    hideSelect: function (element)
    {
        element.setStyle('display', 'none');
    },
    
    showSelect: function (element)
    {
        element.setStyle('display', 'block');
    }
     
});