(function ($){ var stage_default = { "w": 0, "h": 0, "dp": 0, "dppx": 1, "ppi": 0, "di": 0, "size": "", "orientation": ""} ; var stage = $.extend({ } , stage_default); var stageOld = $.extend({ } , stage); $.extend({ stage: function (){ return stage; } } ); $.fn.extend({ stage: function (callback){ return this.each(function (){ if ($(this).get(0) !== window) throw new Error("jquery: stage: you can only bind 'stage' events onto the 'window' object") $(this).bind("stage", callback); } ); } } ); $.stage.version = "1.1.5"; $.stage.debug = 0; var debug = function (level, msg){ if ($.stage.debug >= level && typeof console !== "undefined" && typeof console.log === "function") console.log("jquery: stage: DEBUG[" + level + "]: " + msg); } ; var settings = { ppi: null , size: null , orientation: null } ; var prefix = "var"; $.each(stage, function (name){ if (prefix !== "var") prefix += ","; prefix += " " + name + " = stage." + name; } ); prefix += "; return ("; var postfix = ");"; $.stage.settings = function (_settings){ $.each(settings, function (key1){ settings[key1] = { } ; if (typeof _settings[key1] === "undefined") throw new Error("jquery: stage: no such field " + key1 + " in provided settings") $.each(_settings[key1], function (key2, val){ if (val === "*") settings[key1][key2] = val; else settings[key1][key2] = new Function("stage", prefix + val + postfix); } ); } ); } ; $.stage.settings({ ppi: { "100": "dp > 1024 && dppx <= 1.0", "130": "*", "160": "dp < 1024 && dppx >= 2.0"} , size: { "phone": "0.0 <= di && di < 6.5", "tablet": "6.5 <= di && di < 12.0", "desktop": "*"} , orientation: { "portrait": "h > w * 1.2", "square": "*", "landscape": "w > h * 1.2"} } ); var calculate_one = function (name, options, stage){ debug(2, "(re)calculating the stage " + name + " parameter"); var res = null ; var def = null ; $.each(options, function (value, fn){ if (fn === "*") def = value; else if (fn.call(null , stage) === true ) { res = value; return false ; } return true ; } ); if (res === null && def !== null ) res = def; return res; } ; var calculate_all = function (){ debug(1, "(re)calculating all stage parameters"); var S = $.extend({ } , stage_default); S.w = parseInt($(window).width()); S.h = parseInt($(window).height()); S.dp = Math.round(10 * Math.sqrt(S.w * S.w + S.h * S.h)) / 10; S.dppx = (typeof S.dppx !== "undefined"? parseFloat(window.devicePixelRatio): 1); S.ppi = parseFloat(calculate_one("ppi", settings.ppi, S)); S.di = Math.round(10 * (S.dp / S.ppi)) / 10; S.size = calculate_one("size", settings.size, S); S.orientation = calculate_one("orientation", settings.orientation, S); var difference = false ; $.each(stage, function (key, val){ if (val !== S[key]) { difference = true ; return false ; } } ); if (difference) { stageOld = stage; stage = S; } return difference; } ; var update_stage = function (forced){ var difference = calculate_all(); if (difference || forced) { $(window).trigger("stage", [stage, stageOld] ); } } ; $(window).bind("resize", function (ev){ if (_AN_Read_target("target", ev) !== this) return ; update_stage(false ); } ); $(window).bind("orientationchange", function (ev){ if (_AN_Read_target("target", ev) !== this) return ; update_stage(false ); } ); $(document).ready(function (){ update_stage(true ); } ); } )(jQuery);