/*! LAB.js (LABjs :: Loading And Blocking JavaScript) v2.0.3 (c) Kyle Simpson MIT License */ (function(global){ var _$LAB = global.$LAB, // constants for the valid keys of the options object _UseLocalXHR = "UseLocalXHR", _AlwaysPreserveOrder = "AlwaysPreserveOrder", _AllowDuplicates = "AllowDuplicates", _CacheBust = "CacheBust", /*!START_DEBUG*/_Debug = "Debug",/*!END_DEBUG*/ _BasePath = "BasePath", // stateless variables used across all $LAB instances root_page = /^[^?#]*\//.exec(location.href)[0], root_domain = /^\w+\:\/\/\/?[^\/]+/.exec(root_page)[0], append_to = document.head || document.getElementsByTagName("head"), // inferences... ick, but still necessary opera_or_gecko = (global.opera && Object.prototype.toString.call(global.opera) == "[object Opera]") || ("MozAppearance" in document.documentElement.style), /*!START_DEBUG*/ // console.log() and console.error() wrappers log_msg = function(){}, log_error = log_msg, /*!END_DEBUG*/ // feature sniffs (yay!) test_script_elem = document.createElement("script"), explicit_preloading = typeof test_script_elem.preload == "boolean", // http://wiki.whatwg.org/wiki/Script_Execution_Control#Proposal_1_.28Nicholas_Zakas.29 real_preloading = explicit_preloading || (test_script_elem.readyState && test_script_elem.readyState == "uninitialized"), // will a script preload with `src` set before DOM append? script_ordered_async = !real_preloading && test_script_elem.async === true, // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order // XHR preloading (same-domain) and cache-preloading (remote-domain) are the fallbacks (for some browsers) xhr_or_cache_preloading = !real_preloading && !script_ordered_async && !opera_or_gecko ; /*!START_DEBUG*/ // define console wrapper functions if applicable if (global.console && global.console.log) { if (!global.console.error) global.console.error = global.console.log; log_msg = function(msg) { global.console.log(msg); }; log_error = function(msg,err) { global.console.error(msg,err); }; } /*!END_DEBUG*/ // test for function function is_func(func) { return Object.prototype.toString.call(func) == "[object Function]"; } // test for array function is_array(arr) { return Object.prototype.toString.call(arr) == "[object Array]"; } // make script URL absolute/canonical function canonical_uri(src,base_path) { var absolute_regex = /^\w+\:\/\//; // is `src` is protocol-relative (begins with // or ///), prepend protocol if (/^\/\/\/?/.test(src)) { src = location.protocol + src; } // is `src` page-relative? (not an absolute URL, and not a domain-relative path, beginning with /) else if (!absolute_regex.test(src) && src.charAt(0) != "/") { // prepend `base_path`, if any src = (base_path || "") + src; } // make sure to return `src` as absolute return absolute_regex.test(src) ? src : ((src.charAt(0) == "/" ? root_domain : root_page) + src); } // merge `source` into `target` function merge_objs(source,target) { for (var k in source) { if (source.hasOwnProperty(k)) { target[k] = source[k]; // TODO: does this need to be recursive for our purposes? }} return target; } // does the chain group have any ready-to-execute scripts? function check_chain_group_scripts_ready(chain_group) { var any_scripts_ready = false; for (var i=0; i 0) { for (var i=0; i=0;) { val = queue.shift(); $L = $L[val.type].apply(null,val.args); } return $L; }, // rollback `[global].$LAB` to what it was before this file was loaded, the return this current instance of $LAB noConflict:function(){ global.$LAB = _$LAB; return instanceAPI; }, // create another clean instance of $LAB sandbox:function(){ return create_sandbox(); } }; return instanceAPI; } // create the main instance of $LAB global.$LAB = create_sandbox(); /* The following "hack" was suggested by Andrea Giammarchi and adapted from: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html NOTE: this hack only operates in FF and then only in versions where document.readyState is not present (FF < 3.6?). The hack essentially "patches" the **page** that LABjs is loaded onto so that it has a proper conforming document.readyState, so that if a script which does proper and safe dom-ready detection is loaded onto a page, after dom-ready has passed, it will still be able to detect this state, by inspecting the now hacked document.readyState property. The loaded script in question can then immediately trigger any queued code executions that were waiting for the DOM to be ready. For instance, jQuery 1.4+ has been patched to take advantage of document.readyState, which is enabled by this hack. But 1.3.2 and before are **not** safe or fixed by this hack, and should therefore **not** be lazy-loaded by script loader tools such as LABjs. */ (function(addEvent,domLoaded,handler){ if (document.readyState == null && document[addEvent]){ document.readyState = "loading"; document[addEvent](domLoaded,handler = function(){ document.removeEventListener(domLoaded,handler,false); document.readyState = "complete"; },false); } })("addEventListener","DOMContentLoaded"); })(this);