﻿/**
* @author alexander.farkas
* @version 1.2
*/
(function ($) {
    $.testMedia = function (str) {
        var date = new Date().getTime(), styleS, div = $('<div class="testMediaQuery' + date + '"></div>').css({
            visibility: 'hidden',
            position: 'absolute'
        }).appendTo('body'), style = document.createElement('style');
        style.setAttribute('type', 'text/css');
        style.setAttribute('media', str);
        style = $(style).prependTo('head');
        styleS = document.styleSheets[0];
        if (styleS.cssRules || styleS.rules) {
            if (styleS.insertRule) {
                styleS.insertRule('.testMediaQuery' + date + ' {display:none !important;}', styleS.cssRules.length);
            } else if (styleS.addRule) {
                styleS.addRule('.testMediaQuery' + date, 'display:none');
            }
        }
        var ret = div.css('display') === 'none';
        div.remove();
        style.remove();
        return ret;
    };
    $.arrayInString = function (str, arr) {
        var ret = -1;
        $.each(arr, function (i, item) {
            if (str.indexOf(item) != -1) {
                ret = i;
                return false;
            }
        });
        return ret;
    };
    $.enableMediaQuery = (function () {
        var styles = [], styleLinks, date = new Date().getTime();
        function parseMedia(link) {
            var medias = link.getAttribute('media'),
				pMin = /\(\s*min-width\s*:\s*(\d+)px\s*\)/,
				pMax = /\(\s*max-width\s*:\s*(\d+)px\s*\)/,
				resMin,
				resMax,
				supportedMedia = ['handheld', 'all', 'screen', 'projection', 'tty', 'tv', 'print'],
				curMedia,
	            mediaString = [];
            medias = (!medias) ? ['all'] : medias.split(',');

            for (var i = 0, len = medias.length; i < len; i++) {
                curMedia = $.arrayInString(medias[i], supportedMedia);

                if (curMedia != -1) {

                    curMedia = supportedMedia[curMedia];
                    if (!resMin) {
                        resMin = pMin.exec(medias[i]);
                        if (resMin) {
                            resMin = parseInt(resMin[1], 10);
                        }
                    }
                    if (!resMax) {
                        resMax = pMax.exec(medias[i]);
                        if (resMax) {
                            resMax = parseInt(resMax[1], 10);
                        }
                    }
                    mediaString.push(curMedia);
                }
            }
            if (resMin || resMax) {
                styles.push({
                    obj: link,
                    min: resMin,
                    max: resMax,
                    medium: mediaString.join(','),
                    used: false
                });
            }
        }
        return {
            init: function () {
                if (!styleLinks) {
                    var resizeTimer;
                    styleLinks = $('link[rel*=style]').each(function () {
                        parseMedia(this);
                    });
                    $.enableMediaQuery.adjust();
                    $(window).bind('resize.mediaQueries', function () {
                        clearTimeout(resizeTimer);
                        resizeTimer = setTimeout($.enableMediaQuery.adjust, 29);
                    });
                }
            },
            adjust: function () {
                var width = $(window).width(),
					addStyles = [],
					changeQuery,
					shouldUse,
					i, len
				;

                for (i = 0, len = styles.length; i < len; i++) {
                    shouldUse = !styles[i].obj.disabled && ((!(styles[i].min && styles[i].min > width) && !(styles[i].max && styles[i].max < width)) || (!styles[i].max && !styles[i].min));
                    if (shouldUse) {
                        var n = styles[i].obj.cloneNode(true);
                        n.setAttribute('media', styles[i].medium);
                        n.className = 'insertStyleforMedia' + date;
                        addStyles.push(n);
                        if (!styles[i].used) {
                            styles[i].used = true;
                            changeQuery = true;
                        }
                    } else if (styles[i].used !== shouldUse) {
                        styles[i].used = false;
                        changeQuery = true;
                    }
                }

                if (changeQuery) {
                    $('link.insertStyleforMedia' + date).remove();
                    var head = document.getElementsByTagName('head');
                    for (i = 0, len = addStyles.length; i < len; i++) {
                        head[0].appendChild(addStyles[i]);
                    }
                    //repaint
                    $('body').css('zoom', '1').css('zoom', '');
                }
            }
        };
    })();
    //make some odd assumption before dom-ready
    $.support.mediaQueries = !($.browser.msie && parseFloat($.browser.version, 10) < 9) || ($.browser.mozilla && parseFloat($.browser.version, 10) < 1.9);
    setTimeout(function () {
        if (!$.isReady && document.body && !$.support.mediaQueries) {
            try {
                $.enableMediaQuery.init();
            } catch (e) { }
        }
    }, 1);
    $(function () {
        //test media query compatibility
        $.support.mediaQueries = $.testMedia('only all');
        if (!$.support.mediaQueries) {
            $.enableMediaQuery.init();
        }
    });
})(jQuery);
