/* Copyright 2003-2008 Emergent Music LLC  All rights reserved.
$Id$
*/

FLYFI.ClickHandler = function () {  // class
    /* When a user double-clicks, jQuery provides three events:
        1. click
        2. click
        3. double-click
       However, in some cases, particularly loading YouTube tracks, this is problematic: the
       code cannot handle the click events quickly enough to get out of the way for the double-
       click event.  
       
       In such cases call:
        widget.click(function(event) { event.preventDefault(); FLYFI.clickHandler.pushClick(widget, myClickHandler); });
        widget.dblclick(function(event) { event.preventDefault(); FLYFI.clickHandler.pushDoubleClick(widget, myDoubleClickHandler); });
  
       This class will wait enough time to see if it is a double-click situation and then call
       your handler with the widget as a parameter:
        myClickHandler(widget); or myDoubleClickHandler(widget);
    */
       
    var self = this;
    self.TIMER_MSEC = 500;              // how quickly we check for events
    self.DOUBLECLICK_MAX_MSEC = 500;    // max time between clicks to consider it a double-click
    
    self.events = [];            // sorted by time with the oldest event at [0]
    
    self.init = function () {
        setInterval(FLYFI.clickHandler.onTimer, self.TIMER_MSEC);
    };
    
    self.pushClick = function(widget, handler) {
        var date = new Date();
        self.events.push({'time': date.getTime(), 'doubleClick': false, 'widget': widget, 'handler': handler});
    };

    self.pushDoubleClick = function(widget, handler) {
        var date = new Date();
        self.events.push({'time': date.getTime(), 'doubleClick': true, 'widget': widget, 'handler': handler});
    };
    
    self.onTimer = function() {
        // process this first event when it is old enought to know if it was a double-click
        if (self.events.length === 0) { return; }
        
        var date = new Date();
        var currentTime = date.getTime();
        if (currentTime - self.events[0].time < self.DOUBLECLICK_MAX_MSEC) { return; }
        
        var event = self.events.shift();
        var widget = event.widget;
        var doubleClick = event.doubleClick;
        var handler = event.handler;
        
        // find all events for this widget, checking for doubleclicks
        var matchingEventIndexes = [];
        var l = self.events.length;
        for (var i = 0; i < l; ++i) {
            if (self.events[i].widget == widget) {
                matchingEventIndexes.push(i);
                if (self.events[i].doubleClick) {
                    doubleClick = true;
                    handler = self.events[i].handler;
                }
            }
        }
        
        // remove all of the matching events
        for (i = matchingEventIndexes.length - 1; i >= 0; --i) { // do it backwards to preserver indexes
            self.events.splice(i, 1);
        }
            
        // perform the event
        handler(widget);
    };

};
FLYFI.clickHandler = new FLYFI.ClickHandler();

$(document).ready(function() {
    FLYFI.clickHandler.init();
});
