/*! jRespond.js v 0.10 | Author: Jeremy Fields [jeremy.fields@viget.com], 2013 | License: MIT */ // Universal Module Definition ;(function (window, name, fn) { // Node module pattern if (typeof module === "object" && module && typeof module.exports === "object") { module.exports = fn; } else { // browser window[name] = fn; // AMD definition if (typeof define === "function" && define.amd) { define(name, [], function (module) { return fn; }); } } }(this, 'jRespond', function(win,doc,undefined) { 'use strict'; return function(breakpoints) { // array for registered functions var mediaListeners = []; // array that corresponds to mediaListeners and holds the current on/off state var mediaInit = []; // array of media query breakpoints; adjust as needed var mediaBreakpoints = breakpoints; // store the current breakpoint var curr = ''; // the previous breakpoint var prev = ''; // window resize event timer stuff var resizeTimer; var resizeW = 0; var resizeTmrFast = 100; var resizeTmrSlow = 500; var resizeTmrSpd = resizeTmrSlow; // cross browser window width var winWidth = function() { var w = 0; // IE if (typeof( window.innerWidth ) != 'number') { if (!(document.documentElement.clientWidth === 0)) { // strict mode w = document.documentElement.clientWidth; } else { // quirks mode w = document.body.clientWidth; } } else { // w3c w = window.innerWidth; } return w; }; // determine input type var addFunction = function(elm) { if (elm.length === undefined) { addToStack(elm); } else { for (var i = 0; i < elm.length; i++) { addToStack(elm[i]); } } }; // send media to the mediaListeners array var addToStack = function(elm) { var brkpt = elm['breakpoint']; var entr = elm['enter'] || undefined; // add function to stack mediaListeners.push(elm); // add corresponding entry to mediaInit mediaInit.push(false); if (testForCurr(brkpt)) { if (entr !== undefined) { entr.call(null, {entering : curr, exiting : prev}); } mediaInit[(mediaListeners.length - 1)] = true; } }; // loops through all registered functions and determines what should be fired var cycleThrough = function() { var enterArray = []; var exitArray = []; for (var i = 0; i < mediaListeners.length; i++) { var brkpt = mediaListeners[i]['breakpoint']; var entr = mediaListeners[i]['enter'] || undefined; var exit = mediaListeners[i]['exit'] || undefined; if (brkpt === '*') { if (entr !== undefined) { enterArray.push(entr); } if (exit !== undefined) { exitArray.push(exit); } } else if (testForCurr(brkpt)) { if (entr !== undefined && !mediaInit[i]) { enterArray.push(entr); } mediaInit[i] = true; } else { if (exit !== undefined && mediaInit[i]) { exitArray.push(exit); } mediaInit[i] = false; } } var eventObject = { entering : curr, exiting : prev }; // loop through exit functions to call for (var j = 0; j < exitArray.length; j++) { exitArray[j].call(null, eventObject); } // then loop through enter functions to call for (var k = 0; k < enterArray.length; k++) { enterArray[k].call(null, eventObject); } }; // checks for the correct breakpoint against the mediaBreakpoints list var returnBreakpoint = function(width) { var foundBrkpt = false; // look for existing breakpoint based on width for (var i = 0; i < mediaBreakpoints.length; i++) { // if registered breakpoint found, break out of loop if (width >= mediaBreakpoints[i]['enter'] && width <= mediaBreakpoints[i]['exit']) { foundBrkpt = true; break; } } // if breakpoint is found and it's not the current one if (foundBrkpt && curr !== mediaBreakpoints[i]['label']) { prev = curr; curr = mediaBreakpoints[i]['label']; // run the loop cycleThrough(); // or if no breakpoint applies } else if (!foundBrkpt && curr !== '') { curr = ''; // run the loop cycleThrough(); } }; // takes the breakpoint/s arguement from an object and tests it against the current state var testForCurr = function(elm) { // if there's an array of breakpoints if (typeof elm === 'object') { if (elm.join().indexOf(curr) >= 0) { return true; } // if the string is '*' then run at every breakpoint } else if (elm === '*') { return true; // or if it's a single breakpoint } else if (typeof elm === 'string') { if (curr === elm) { return true; } } }; // self-calling function that checks the browser width and delegates if it detects a change var checkResize = function() { // get current width var w = winWidth(); // if there is a change speed up the timer and fire the returnBreakpoint function if (w !== resizeW) { resizeTmrSpd = resizeTmrFast; returnBreakpoint(w); // otherwise keep on keepin' on } else { resizeTmrSpd = resizeTmrSlow; } resizeW = w; // calls itself on a setTimeout setTimeout(checkResize, resizeTmrSpd); }; checkResize(); // return return { addFunc: function(elm) { addFunction(elm); }, getBreakpoint: function() { return curr; } }; }; }(this,this.document)));