/** * History.js Dojo Adapter * * Essentially the same as the native adapter but uses dojo/ready for the dom load callback. * * @author Benjamin Arthur Lupton <contact@balupton.com> * @copyright 2010-2011 Benjamin Arthur Lupton <contact@balupton.com> * @license New BSD License <http://creativecommons.org/licenses/BSD/> */ // Closure (function(window,undefined){ "use strict"; // Localise Globals var History = window.History = window.History||{}, require = window.require; // Check Existence if ( typeof History.Adapter !== 'undefined' ) { throw new Error('History.js Adapter has already been loaded...'); } // Add the Adapter History.Adapter = { /** * History.Adapter.handlers[uid][eventName] = Array */ handlers: {}, /** * History.Adapter._uid * The current element unique identifier */ _uid: 1, /** * History.Adapter.uid(element) * @param {Element} element * @return {String} uid */ uid: function(element){ return element._uid || (element._uid = History.Adapter._uid++); }, /** * History.Adapter.bind(el,event,callback) * @param {Element} element * @param {String} eventName - custom and standard events * @param {Function} callback * @return */ bind: function(element,eventName,callback){ // Prepare var uid = History.Adapter.uid(element); // Apply Listener History.Adapter.handlers[uid] = History.Adapter.handlers[uid] || {}; History.Adapter.handlers[uid][eventName] = History.Adapter.handlers[uid][eventName] || []; History.Adapter.handlers[uid][eventName].push(callback); // Bind Global Listener element['on'+eventName] = (function(element,eventName){ return function(event){ History.Adapter.trigger(element,eventName,event); }; })(element,eventName); }, /** * History.Adapter.trigger(el,event) * @param {Element} element * @param {String} eventName - custom and standard events * @param {Object} event - a object of event data * @return */ trigger: function(element,eventName,event){ // Prepare event = event || {}; var uid = History.Adapter.uid(element), i,n; // Apply Listener History.Adapter.handlers[uid] = History.Adapter.handlers[uid] || {}; History.Adapter.handlers[uid][eventName] = History.Adapter.handlers[uid][eventName] || []; // Fire Listeners for ( i=0,n=History.Adapter.handlers[uid][eventName].length; i<n; ++i ) { History.Adapter.handlers[uid][eventName][i].apply(this,[event]); } }, /** * History.Adapter.extractEventData(key,event,extra) * @param {String} key - key for the event data to extract * @param {String} event - custom and standard events * @return {mixed} */ extractEventData: function(key,event){ var result = (event && event[key]) || undefined; return result; }, /** * History.Adapter.onDomLoad(callback) * @param {Function} callback * @return */ onDomLoad: function(callback) { require(["dojo/ready"], function(ready) { ready(callback); }); } }; // Try to Initialise History if ( typeof History.init !== 'undefined' ) { History.init(); } })(window);