var DISPATCHER = new mfObserver([
"STOPALL",
"SLOW_RIGHT",
"SLOW_LEFT",
"MANUAL_RIGHT",        //MANUAL RIGHT REQUESTED BY USER
"MANUAL_RIGHT_FINISH", //MANUAL RIGHT FINISHED
"MANUAL_LEFT",         //MANUAL LEFT REQUESTED
"MANUAL_LEFT_FINISH",  //MANUAL LEFT FINISHED
"PAGE_RIGHT",
"PAGE_LEFT",
"SNAP_TO_GRID_RIGHT",   //SNAP TO GRID RIGHT
"SNAP_TO_GRID_LEFT",    //SNAP TO GRID LEFT
"SNAP_TO_GRID_RESET",   //clears the SNAP TO GRID semaphores
"CREATE_LB_SUBMIT",     //user wants to save lightbox
"DELETE_LB_SUBMIT",     //user wants to delete lightbox
"RENAME_LB_SUBMIT",     //user wants to rename lightbox
"VIEW_LB_SUBMIT",       //user wants to view lightbox
"COMMENT_LB_SUBMIT",    //user wants to comment lightbox
"SHARE_LB_SUBMIT",      //user wants to share lightbox
"STOP_SLIDER",          //stops the slider loop
"START_SLIDER",         //starts the slider loop
"LB_CONFIRM_SUCCESS",
"LB_CONFIRM_FAILURE",
"PANEL_SLIDE_OUT",
"PANEL_SLIDE_IN",
"MANUAL_SS_RIGHT",        //MANUAL SIMSEARCH RIGHT REQUESTED
"MANUAL_SS_RIGHT_FINISH", //MANUAL SIMSEARCH RIGHT FINISHED
"MANUAL_SS_LEFT",         //MANUAL SIMSEARCH LEFT REQUESTED
"MANUAL_SS_LEFT_FINISH",   //MANUAL SIMSEARCH LEFT FINISHED 
"SET_USER_PREFS",
"GET_USER_PREFS",
"SET_ACTIVE_LB_FROM_TOOL",  //ACTIVE LB SET FROM TOOL  
"GET_USER_SEARCH_HISTORY",
"CANCEL_NEXT_THUMBNAIL_POPUP",
"CLOSE_SEARCH_POPUP",  //closes the search results associated popup
"CANCEL_NEXT_SIM_POPUP", //cancels the scheduled popup over simsearch
"CLOSE_SIMSEARCH_POPUP",  //closes the simsearch results associated popup
"NEW_SEARCH",
"IMAGE_ENLARGED",        //something enlarged an image
"SEARCH_RESULTS_PROCESSED" //something fetched and processed the search results
]);

var EventBuffer = function(){
    this.params = {};
    this.name = null;
    return this;
}

EventBuffer.prototype.set = function(name){
    this.name = name;
}

EventBuffer.prototype.set = function(name, param){
    this.name = name;
    this.params = param;
}

EventBuffer.prototype.unset = function(){
    this.name = null;
    this.params = {};
}

EventBuffer.prototype.get = function(){
    return this.name;
}

EventBuffer.prototype.getParam = function(){
    return this.params;
}

var EBUFFER = new EventBuffer();

var EventLock = function(){
    this.storage = {
         "WAS_SNAP_RIGHT" : false,
         "WAS_SNAP_LEFT": false,
         "UI_IS_BUSY": false, //crucial lock will ignore additional UI requests if the app is busy doing something
         "CART_BUSY": false, //lock for adding to cart
         "SCREEN_ROLL_EXPIRED": false, //timeout lock for adding to cart
         "LIGHTBOX_INIT": false, //lightbox is being initialized
         "MODAL_INFO_LOCK": false //lock for the modal info window
    };
    this.on_complete = null;
    return this;
}

EventLock.prototype.exists = function(name){
    var unknown;
    return !(unknown == this.storage[name]);
}

EventLock.prototype.set = function(name){
    if (!this.exists(name)){
        debug("EventLock set -> bad name: "+name);
    } else {
        this.storage[name] = true;
    }
}

EventLock.prototype.unset = function(name){
    if (!this.exists(name)){
        debug("EventLock unset -> bad name: "+name);
    } else {
        this.storage[name] = false;
    }
}

EventLock.prototype.get = function(name){
    if (!this.exists(name)){
        debug("EventLock get -> bad name: "+name);
    }
    return this.storage[name];
}

EventLock.prototype.onCompletePush = function(val,param){this.on_complete = val; if (param) ELOCKS.setParam(val,param) }
EventLock.prototype.onCompletePop = function(){var v = this.on_complete; this.on_complete = null; return v;}


var ELOCKS = new EventLock();

var SCREEN_ROLL_TIMEOUT = null;
function startScreenRollTimeout(){
    ELOCKS.unset("SCREEN_ROLL_EXPIRED");
    SCREEN_ROLL_TIMEOUT = setTimeout(function(){ELOCKS.set("SCREEN_ROLL_EXPIRED");},1000 * 60 * 2);//time in minutes in milliseconds
}
function stopScreenRollTimeout(){
    if(SCREEN_ROLL_TIMEOUT != null){
        clearTimeout(SCREEN_ROLL_TIMEOUT);
        SCREEN_ROLL_TIMEOUT = null;
    }
}

var AUTO_BROWSE_TIMEOUT = null;
function stopAutoBrowseTimeout(){
    if(AUTO_BROWSE_TIMEOUT != null){
        clearTimeout(AUTO_BROWSE_TIMEOUT);
        AUTO_BROWSE_TIMEOUT = null;
    }
}
