/*! matchMedia() polyfill addListener/removeListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */
(function (w) {
    "use strict";
    // Bail out for browsers that have addListener support
    if (w.matchMedia && w.matchMedia('all').addListener) {
        return false;
    }

    var localMatchMedia = w.matchMedia,
		hasMediaQueries = localMatchMedia('only all').matches,
		isListening = false,
		timeoutID = 0,    // setTimeout for debouncing 'handleChange'
		queries = [],   // Contains each 'mql' and associated 'listeners' if 'addListener' is used
		handleChange = function (evt) {
		    // Debounce
		    w.clearTimeout(timeoutID);

		    timeoutID = w.setTimeout(function () {
		        for (var i = 0, il = queries.length; i < il; i++) {
		            var mql = queries[i].mql,
						listeners = queries[i].listeners || [],
						matches = localMatchMedia(mql.media).matches;

		            // Update mql.matches value and call listeners
		            // Fire listeners only if transitioning to or from matched state
		            if (matches !== mql.matches) {
		                mql.matches = matches;

		                for (var j = 0, jl = listeners.length; j < jl; j++) {
		                    listeners[j].call(w, mql);
		                }
		            }
		        }
		    }, 30);
		};

    w.matchMedia = function (media) {
        var mql = localMatchMedia(media),
			listeners = [],
			index = 0;

        mql.addListener = function (listener) {
            // Changes would not occur to css media type so return now (Affects IE <= 8)
            if (!hasMediaQueries) {
                return;
            }

            // Set up 'resize' listener for browsers that support CSS3 media queries (Not for IE <= 8)
            // There should only ever be 1 resize listener running for performance
            if (!isListening) {
                isListening = true;
                w.addEventListener('resize', handleChange, true);
            }

            // Push object only if it has not been pushed already
            if (index === 0) {
                index = queries.push({
                    mql: mql,
                    listeners: listeners
                });
            }

            listeners.push(listener);
        };

        mql.removeListener = function (listener) {
            for (var i = 0, il = listeners.length; i < il; i++) {
                if (listeners[i] === listener) {
                    listeners.splice(i, 1);
                }
            }
        };

        return mql;
    };
}(this));
