/**
 * DropDown class
 * @author njoy
 */
var dropDownTemporaryObjectInstancehdfgdfgTdhdgdddldjTdhljsgsjdfYug = null;

function DropDown() {

  /**
   * Clicked status
   */
  this.clicked = false;
  
  /**
   * Drop down id
   */
  this.Id = null;
  
  /**
   * Option item background - normal
   */
  this.normalBg = null;
  
  /**
   * Option item background - over
   */
  this.overBg = null;
  
  /**
   * Drop down container
   */
  this.container = null;
  
  /**
   * Drop down option container (after click - displaying)
   */
  this.optionContainerId = null;
  
  /**
   * Drop down option list
   */
  this.option = new Array();
  
  /**
   * Selected option item
   */
  this.active = null;
  
  /**
   * Result data
   * keys: 0 - value, 1 - label
   */
  this.result = new Array();
  
  /** 
   * Observators
   */
  this.observators = new Array();
  
  
  /**
   * Constructor
   */
  this.initialize = __construct;
  
  /**
   * Event trigger
   */
  //this.eventTrigger = eventTrigger;
  
  /**
   * Display drop down option list
   */
  this.openDropDown = openDropDown;
  
  /**
   * Close drop down
   */
  this.closeDropDown = closeDropDown;
  
  /**
   * Set tmp drop down object instance
   */
  this.setInstance = setInstance;
  
  /**
   * Return tmp drop dwon object instance
   */
  this.getInstance = getInstance;
  
  
  /**
   * Option item event handler
   */
  this.setOptItemHandler = setOptItemHandler;
  
  /**
   * Set drop down result
   */ 
  this.setResult = setResult;
  
  /**
   * Return result
   */ 
  this.getResult = getResult;
  
  /**
   * Add observator
   */
  this.addObservator = addObservator;
  
  /**
   * Run observators
   */
  this.runObservators = runObservators;
  
  
  /**
   * Constructor
   * @param string id 
   * @param string normalBg
   * @param string overBg
   * @return void
   */
  function __construct(id, normalBg, overBg) {
  
    this.Id = id;
    this.normalBg = normalBg;
    this.overBg = overBg;
    this.container = getNodeById(this.Id);

    var option = this.container.getElementsByTagName('ul');     
    var active = getElementsByClassName(this.Id, 'div', 'activeItem');
    
    this.option = option[0];
    this.active = active[0];
    
    this.setInstance();
    
    this.openDropDown();
    
  } // function __construct
  
  /**
   * Display drop down option list
   * @return void
   */
  function openDropDown() {
    
    var self = this.getInstance();
    
    var oldOptContainer = getElementsByClassName(this.Id, 'div', 'itemList');
    
    if(oldOptContainer[0]) {
    
      oldOptContainer[0].parentNode.removeChild(oldOptContainer[0]);
    
    }
        
    var tmpActive = document.createElement('div');
    
    tmpActive.setAttribute('class', 'activeItem');
    
    tmpActive.className = 'activeItem';
    
    tmpActive.innerHTML = this.active.innerHTML;
    
    tmpActive.onclick = function() {
      
      self.closeDropDown();
      
    }
    
    var tmpOption = document.createElement('ul');
    
    tmpOption.style.display = 'block';
    tmpOption.innerHTML = this.option.innerHTML;
    
    this.setOptItemHandler(tmpOption, this);
    
    var optContainer = document.createElement('div');
    
    optContainer.setAttribute('class', 'itemList');
    
    var id = new Date;
    
    id = id.getMinutes() + id.getMilliseconds() + id.getYear() + id.getMonth();
    
    optContainer.setAttribute('id', id);
    
    optContainer.style.display = 'block';
    
    optContainer.style.position = 'absolute';
    optContainer.style.margin = '-' + this.active.offsetHeight + 'px 0 0';
    
    optContainer.appendChild(tmpActive);
    optContainer.appendChild(tmpOption);
    
    this.container.appendChild(optContainer);
    
    this.optContainerId = id;
        
    optContainer.onmousemove = function() {
      
       this.style.display = 'block';
      
    }
    
    optContainer.onmousemoveover = function() {
      
       this.style.display = 'block';
      
    }
    
    optContainer.onmouseout = function() {
      
      this.style.display = 'none';
      
    }
    
  } // function openDropDown
  
  /**
   * Set option item handler
   * @param object option obj
   * @param object DropDown self
   * @return void
   */
  function setOptItemHandler(obj, self) {
    
    var items = obj.getElementsByTagName('li');
    
    for(i = 0, j = items.length; i<j; i++) {

      items[i].onclick = function() {
         
        self.closeDropDown();
        
        self.setResult(this.getAttribute('rel'), this.innerHTML, self);
        
        self.active.innerHTML = '<span>' + this.innerHTML + '</span>';
        
        self.runObservators(self);
        
      };
      
      items[i].onmouseover = function() {
        
        this.style.background = self.overBg;
        
      };

      items[i].onmouseout = function() {
        
        this.style.background = self.normalBg;
        
      };
      
    }
    
  } // function setOptItemHandler
  
  /**
   * Close drop down
   * @return void
   */
  function closeDropDown() {
  
    this.container.removeChild(getNodeById(this.optContainerId));
  
  } // function closeDropDown
  
  /**
   * Add observator
   * @param object observator obj
   * @return void
   */
  function addObservator(obj) {
    
    this.observators.push(obj);
    
  } // function addObservator
  
  /**
   * Run observators
   * @param object DropDown self
   * @return void
   */
  function runObservators(self) {
  
    for(i = 0, j=self.observators.length; i<j; i++) {

      self.observators[i].execute(self);
      
    }
    
  } // function runObservators
  
  /**
   * Set tmp drop down object instance
   * @return void
   */
  function setInstance() {
    
    dropDownTemporaryObjectInstancehdfgdfgTdhdgdddldjTdhljsgsjdfYug = this;
    
  } // function setInstance
  
  /**
   * Return tmp drop down object instance
   * @return DropDown object
   */
  function getInstance() {
    
    return dropDownTemporaryObjectInstancehdfgdfgTdhdgdddldjTdhljsgsjdfYug;
    
  } // function getInstance
  
  /**
   * Set Drop down result
   * @param string value
   * @param string label
   * @param object DropDown obj
   * @return void
   */
  function setResult(value, label, obj) {
    
    
    obj.result = new Array(value, label);
    
  } // function setResult
  
  /**
   * Return Drop down result
   * @return array
   */
  function getResult() {
    
    return this.result;
    
  } // function getResult
  
} // Class DropDown