var filters = Class.create({

    handlerOverClassName:   'hover',
    dropdownCurrent:        null,
    modeOver:               'over',
    modeOut:                'out',
    leftOffset:             -2, // px
    topOffset:              18, // px
    handlerPrefix:          'dd-a-',
    handlerULPrefix:        'dd-ul-',

    initialize: function()
    {
        var filters = $$('ul.filters');
        
        if ( filters.length )
        {
            this.enableFilters(filters);
        } 
        
        var filters2 = $$('ul.dd-instances');
        if ( filters2.length )
        {
            this.enableFilters(filters2);
        } 
        
        Event.observe( document, 'click',   this.onDocumentClick.bindAsEventListener(this) );
        Event.observe( window,   'resize',  this.onWindowResize.bindAsEventListener(this) );
    },
    
    enableFilters: function(filters)
    {
        for (var i=0; i<filters.length; i++)
        {
            var lis = filters[i].childElements();
            if (lis.length)
            {
                for (var j=0; j<lis.length; j++)
                {
                    Event.observe( lis[j].down("a"), 'click', this.onHandlerClick.bindAsEventListener(this));
                }
            }
        }
    },
    
    onWindowResize: function()
    {
        if ( this.dropdownCurrent )
        {
            this.positionUL( this.getHandler(this.dropdownCurrent), true );
        }
    },
    
    onDocumentClick: function()
    {
        this.resetPreviousDropDown();
    },
    
    getHandlerUL: function(handler)
    {
        return $( handler.id.replace(this.handlerPrefix, this.handlerULPrefix) );
    },
    
    getHandler: function(handlerUL)
    {
        return $( handlerUL.id.replace(this.handlerULPrefix, this.handlerPrefix) );
    },
    
    onHandlerClick: function(event) 
    {
        var handler = Event.element(event);
        handler.blur();
        
        // Add id for handler and drop-down
        if (handler.id == '')
        {
            var randUnique = Math.ceil(Math.random() * 1000);
            
            handler.id            = this.handlerPrefix + randUnique;
            handler.next("ul").id = this.handlerULPrefix + randUnique;
            document.body.appendChild(this.getHandlerUL(handler), 'top');
            //document.document.insert({top: this.getHandlerUL(handler) });
        }
        
        if (this.getHandlerUL(handler)) 
        {
            this.rollDropDown( handler, handler.hasClassName( this.handlerOverClassName ) ? this.modeOut : this.modeOver);
        }
        
        Event.stop(event);
    },
    
    rollDropDown: function(handler, mode)
    {
	    if ( mode == this.modeOut )
	    {
		    handler.removeClassName( this.handlerOverClassName );
		    this.getHandlerUL(handler).hide();
		    this.dropdownCurrent = null;
		}
		else if ( mode == this.modeOver )
		{
		    this.resetPreviousDropDown();
		    
            this.positionUL(handler, false );
            
            handler.addClassName( this.handlerOverClassName );
            
            this.getHandlerUL(handler).show();
            this.dropdownCurrent = this.getHandlerUL(handler);
		}
    },
    
    positionUL: function(handler, r) 
    {
        this.getHandlerUL(handler).setStyle({
            "top"  : (this.findPosY(handler) + this.topOffset) + "px",
            "left" : (this.findPosX(handler) + (handler.getWidth() - this.getHandlerUL(handler).getWidth()) + (r ? 0 : this.leftOffset)) + "px"
        });
    },
    
    resetPreviousDropDown: function()
    {
	    // Close previous dropdown
	    if ( this.dropdownCurrent )
	    {
	        this.rollDropDown( this.getHandler(this.dropdownCurrent), this.modeOut);
	    }
    },

	findPosX: function(obj)
	{
	  var curleft = 0;
	  if(obj.offsetParent)
	      while(1) 
	      {
	        curleft += obj.offsetLeft;
	        if(!obj.offsetParent)
	          break;
	        obj = obj.offsetParent;
	      }
	  else if(obj.x)
	      curleft += obj.x;
	  return curleft;
	},
	
	findPosY: function(obj)
	{
	  var curtop = 0;
	  if(obj.offsetParent)
	      while(1)
	      {
	        curtop += obj.offsetTop;
	        if(!obj.offsetParent)
	          break;
	        obj = obj.offsetParent;
	      }
	  else if(obj.y)
	      curtop += obj.y;
	  return curtop;
	}
});

Event.observe(window, 'load', function() {
    new filters();
});