(function($,sr){ // debouncing function from John Hann // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ var debounce = function (func, threshold, execAsap) { var timeout; return function debounced () { var obj = this, args = arguments; function delayed () { if (!execAsap) func.apply(obj, args); timeout = null; }; if (timeout) clearTimeout(timeout); else if (execAsap) func.apply(obj, args); timeout = setTimeout(delayed, threshold || 25); }; } // smartresize jQuery.fn[sr] = function(fn){ return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); }; })(jQuery,'smartresize'); // errors var log = console.log, warn = console.warn; var error = { console: function(error){ warn('error: ' + error.type); }, ui: function(){ return false; } } // events var _event = { _resizes: [], register: function(type,exec,cb){ switch(type){ case 'resize': this._resizes.push(exec); if(cb)cb(); break; default: return false; break; } }, fire: function(type){ switch(type){ case "resize": for(var i in this._resizes){ this._resizes[i](); } break; default: return false; break; } } } // globals var _var = { window: { h: 0, w: 0 } } // main app var _main = { init: function(){ log('main init'); _event.register('resize',function(){ log('I fired'); }); _event.register('resize',function(){ log('I fired too'); }); } } $(function() { // dfd for init function initResize(){ return $.Deferred(function( dfd ){ $(window).smartresize(function(e) { _var.window.h = e.target.innerHeight; _var.window.w = e.target.innerWidth; _event.fire('resize'); }).trigger('resize'); log('resize init'); }).promise(); } $.when( initResize() ).then(_main.init()); });