src/js/libs/lazyload.js
author hamidouk
Mon, 28 Nov 2011 12:11:36 +0100
branchlazyload-js
changeset 340 289725d025d9
permissions -rw-r--r--
replaced minified version by dev version.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
340
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
     1
/*jslint browser: true, eqeqeq: true, bitwise: true, newcap: true, immed: true, regexp: false */
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
     2
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
     3
/**
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
     4
LazyLoad makes it easy and painless to lazily load one or more external
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
     5
JavaScript or CSS files on demand either during or after the rendering of a web
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
     6
page.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
     7
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
     8
Supported browsers include Firefox 2+, IE6+, Safari 3+ (including Mobile
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
     9
Safari), Google Chrome, and Opera 9+. Other browsers may or may not work and
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    10
are not officially supported.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    11
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    12
Visit https://github.com/rgrove/lazyload/ for more info.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    13
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    14
Copyright (c) 2011 Ryan Grove <ryan@wonko.com>
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    15
All rights reserved.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    16
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    17
Permission is hereby granted, free of charge, to any person obtaining a copy of
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    18
this software and associated documentation files (the 'Software'), to deal in
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    19
the Software without restriction, including without limitation the rights to
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    20
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    21
the Software, and to permit persons to whom the Software is furnished to do so,
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    22
subject to the following conditions:
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    23
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    24
The above copyright notice and this permission notice shall be included in all
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    25
copies or substantial portions of the Software.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    26
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    27
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    28
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    29
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    30
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    31
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    32
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    33
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    34
@module lazyload
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    35
@class LazyLoad
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    36
@static
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    37
@version 2.0.3 (git)
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    38
*/
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    39
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    40
LazyLoad = (function (doc) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    41
  // -- Private Variables ------------------------------------------------------
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    42
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    43
  // User agent and feature test information.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    44
  var env,
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    45
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    46
  // Reference to the <head> element (populated lazily).
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    47
  head,
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    48
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    49
  // Requests currently in progress, if any.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    50
  pending = {},
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    51
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    52
  // Number of times we've polled to check whether a pending stylesheet has
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    53
  // finished loading. If this gets too high, we're probably stalled.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    54
  pollCount = 0,
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    55
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    56
  // Queued requests.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    57
  queue = {css: [], js: []},
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    58
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    59
  // Reference to the browser's list of stylesheets.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    60
  styleSheets = doc.styleSheets;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    61
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    62
  // -- Private Methods --------------------------------------------------------
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    63
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    64
  /**
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    65
  Creates and returns an HTML element with the specified name and attributes.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    66
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    67
  @method createNode
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    68
  @param {String} name element name
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    69
  @param {Object} attrs name/value mapping of element attributes
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    70
  @return {HTMLElement}
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    71
  @private
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    72
  */
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    73
  function createNode(name, attrs) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    74
    var node = doc.createElement(name), attr;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    75
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    76
    for (attr in attrs) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    77
      if (attrs.hasOwnProperty(attr)) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    78
        node.setAttribute(attr, attrs[attr]);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    79
      }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    80
    }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    81
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    82
    return node;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    83
  }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    84
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    85
  /**
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    86
  Called when the current pending resource of the specified type has finished
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    87
  loading. Executes the associated callback (if any) and loads the next
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    88
  resource in the queue.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    89
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    90
  @method finish
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    91
  @param {String} type resource type ('css' or 'js')
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    92
  @private
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    93
  */
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    94
  function finish(type) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    95
    var p = pending[type],
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    96
        callback,
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    97
        urls;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    98
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
    99
    if (p) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   100
      callback = p.callback;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   101
      urls     = p.urls;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   102
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   103
      urls.shift();
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   104
      pollCount = 0;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   105
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   106
      // If this is the last of the pending URLs, execute the callback and
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   107
      // start the next request in the queue (if any).
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   108
      if (!urls.length) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   109
        callback && callback.call(p.context, p.obj);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   110
        pending[type] = null;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   111
        queue[type].length && load(type);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   112
      }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   113
    }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   114
  }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   115
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   116
  /**
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   117
  Populates the <code>env</code> variable with user agent and feature test
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   118
  information.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   119
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   120
  @method getEnv
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   121
  @private
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   122
  */
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   123
  function getEnv() {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   124
    var ua = navigator.userAgent;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   125
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   126
    env = {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   127
      // True if this browser supports disabling async mode on dynamically
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   128
      // created script nodes. See
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   129
      // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   130
      async: doc.createElement('script').async === true
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   131
    };
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   132
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   133
    (env.webkit = /AppleWebKit\//.test(ua))
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   134
      || (env.ie = /MSIE/.test(ua))
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   135
      || (env.opera = /Opera/.test(ua))
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   136
      || (env.gecko = /Gecko\//.test(ua))
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   137
      || (env.unknown = true);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   138
  }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   139
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   140
  /**
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   141
  Loads the specified resources, or the next resource of the specified type
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   142
  in the queue if no resources are specified. If a resource of the specified
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   143
  type is already being loaded, the new request will be queued until the
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   144
  first request has been finished.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   145
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   146
  When an array of resource URLs is specified, those URLs will be loaded in
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   147
  parallel if it is possible to do so while preserving execution order. All
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   148
  browsers support parallel loading of CSS, but only Firefox and Opera
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   149
  support parallel loading of scripts. In other browsers, scripts will be
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   150
  queued and loaded one at a time to ensure correct execution order.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   151
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   152
  @method load
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   153
  @param {String} type resource type ('css' or 'js')
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   154
  @param {String|Array} urls (optional) URL or array of URLs to load
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   155
  @param {Function} callback (optional) callback function to execute when the
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   156
    resource is loaded
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   157
  @param {Object} obj (optional) object to pass to the callback function
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   158
  @param {Object} context (optional) if provided, the callback function will
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   159
    be executed in this object's context
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   160
  @private
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   161
  */
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   162
  function load(type, urls, callback, obj, context) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   163
    var _finish = function () { finish(type); },
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   164
        isCSS   = type === 'css',
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   165
        nodes   = [],
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   166
        i, len, node, p, pendingUrls, url;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   167
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   168
    env || getEnv();
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   169
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   170
    if (urls) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   171
      // If urls is a string, wrap it in an array. Otherwise assume it's an
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   172
      // array and create a copy of it so modifications won't be made to the
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   173
      // original.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   174
      urls = typeof urls === 'string' ? [urls] : urls.concat();
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   175
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   176
      // Create a request object for each URL. If multiple URLs are specified,
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   177
      // the callback will only be executed after all URLs have been loaded.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   178
      //
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   179
      // Sadly, Firefox and Opera are the only browsers capable of loading
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   180
      // scripts in parallel while preserving execution order. In all other
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   181
      // browsers, scripts must be loaded sequentially.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   182
      //
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   183
      // All browsers respect CSS specificity based on the order of the link
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   184
      // elements in the DOM, regardless of the order in which the stylesheets
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   185
      // are actually downloaded.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   186
      if (isCSS || env.async || env.gecko || env.opera) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   187
        // Load in parallel.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   188
        queue[type].push({
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   189
          urls    : urls,
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   190
          callback: callback,
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   191
          obj     : obj,
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   192
          context : context
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   193
        });
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   194
      } else {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   195
        // Load sequentially.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   196
        for (i = 0, len = urls.length; i < len; ++i) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   197
          queue[type].push({
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   198
            urls    : [urls[i]],
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   199
            callback: i === len - 1 ? callback : null, // callback is only added to the last URL
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   200
            obj     : obj,
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   201
            context : context
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   202
          });
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   203
        }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   204
      }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   205
    }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   206
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   207
    // If a previous load request of this type is currently in progress, we'll
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   208
    // wait our turn. Otherwise, grab the next item in the queue.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   209
    if (pending[type] || !(p = pending[type] = queue[type].shift())) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   210
      return;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   211
    }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   212
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   213
    head || (head = doc.head || doc.getElementsByTagName('head')[0]);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   214
    pendingUrls = p.urls;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   215
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   216
    for (i = 0, len = pendingUrls.length; i < len; ++i) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   217
      url = pendingUrls[i];
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   218
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   219
      if (isCSS) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   220
          node = env.gecko ? createNode('style') : createNode('link', {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   221
            href: url,
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   222
            rel : 'stylesheet'
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   223
          });
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   224
      } else {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   225
        node = createNode('script', {src: url});
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   226
        node.async = false;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   227
      }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   228
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   229
      node.className = 'lazyload';
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   230
      node.setAttribute('charset', 'utf-8');
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   231
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   232
      if (env.ie && !isCSS) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   233
        node.onreadystatechange = function () {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   234
          if (/loaded|complete/.test(node.readyState)) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   235
            node.onreadystatechange = null;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   236
            _finish();
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   237
          }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   238
        };
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   239
      } else if (isCSS && (env.gecko || env.webkit)) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   240
        // Gecko and WebKit don't support the onload event on link nodes.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   241
        if (env.webkit) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   242
          // In WebKit, we can poll for changes to document.styleSheets to
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   243
          // figure out when stylesheets have loaded.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   244
          p.urls[i] = node.href; // resolve relative URLs (or polling won't work)
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   245
          pollWebKit();
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   246
        } else {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   247
          // In Gecko, we can import the requested URL into a <style> node and
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   248
          // poll for the existence of node.sheet.cssRules. Props to Zach
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   249
          // Leatherman for calling my attention to this technique.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   250
          node.innerHTML = '@import "' + url + '";';
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   251
          pollGecko(node);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   252
        }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   253
      } else {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   254
        node.onload = node.onerror = _finish;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   255
      }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   256
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   257
      nodes.push(node);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   258
    }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   259
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   260
    for (i = 0, len = nodes.length; i < len; ++i) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   261
      head.appendChild(nodes[i]);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   262
    }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   263
  }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   264
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   265
  /**
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   266
  Begins polling to determine when the specified stylesheet has finished loading
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   267
  in Gecko. Polling stops when all pending stylesheets have loaded or after 10
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   268
  seconds (to prevent stalls).
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   269
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   270
  Thanks to Zach Leatherman for calling my attention to the @import-based
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   271
  cross-domain technique used here, and to Oleg Slobodskoi for an earlier
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   272
  same-domain implementation. See Zach's blog for more details:
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   273
  http://www.zachleat.com/web/2010/07/29/load-css-dynamically/
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   274
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   275
  @method pollGecko
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   276
  @param {HTMLElement} node Style node to poll.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   277
  @private
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   278
  */
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   279
  function pollGecko(node) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   280
    var hasRules;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   281
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   282
    try {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   283
      // We don't really need to store this value or ever refer to it again, but
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   284
      // if we don't store it, Closure Compiler assumes the code is useless and
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   285
      // removes it.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   286
      hasRules = !!node.sheet.cssRules;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   287
    } catch (ex) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   288
      // An exception means the stylesheet is still loading.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   289
      pollCount += 1;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   290
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   291
      if (pollCount < 200) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   292
        setTimeout(function () { pollGecko(node); }, 50);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   293
      } else {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   294
        // We've been polling for 10 seconds and nothing's happened. Stop
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   295
        // polling and finish the pending requests to avoid blocking further
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   296
        // requests.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   297
        hasRules && finish('css');
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   298
      }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   299
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   300
      return;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   301
    }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   302
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   303
    // If we get here, the stylesheet has loaded.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   304
    finish('css');
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   305
  }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   306
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   307
  /**
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   308
  Begins polling to determine when pending stylesheets have finished loading
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   309
  in WebKit. Polling stops when all pending stylesheets have loaded or after 10
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   310
  seconds (to prevent stalls).
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   311
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   312
  @method pollWebKit
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   313
  @private
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   314
  */
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   315
  function pollWebKit() {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   316
    var css = pending.css, i;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   317
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   318
    if (css) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   319
      i = styleSheets.length;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   320
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   321
      // Look for a stylesheet matching the pending URL.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   322
      while (--i >= 0) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   323
        if (styleSheets[i].href === css.urls[0]) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   324
          finish('css');
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   325
          break;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   326
        }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   327
      }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   328
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   329
      pollCount += 1;
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   330
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   331
      if (css) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   332
        if (pollCount < 200) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   333
          setTimeout(pollWebKit, 50);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   334
        } else {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   335
          // We've been polling for 10 seconds and nothing's happened, which may
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   336
          // indicate that the stylesheet has been removed from the document
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   337
          // before it had a chance to load. Stop polling and finish the pending
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   338
          // request to prevent blocking further requests.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   339
          finish('css');
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   340
        }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   341
      }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   342
    }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   343
  }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   344
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   345
  return {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   346
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   347
    /**
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   348
    Requests the specified CSS URL or URLs and executes the specified
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   349
    callback (if any) when they have finished loading. If an array of URLs is
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   350
    specified, the stylesheets will be loaded in parallel and the callback
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   351
    will be executed after all stylesheets have finished loading.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   352
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   353
    @method css
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   354
    @param {String|Array} urls CSS URL or array of CSS URLs to load
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   355
    @param {Function} callback (optional) callback function to execute when
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   356
      the specified stylesheets are loaded
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   357
    @param {Object} obj (optional) object to pass to the callback function
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   358
    @param {Object} context (optional) if provided, the callback function
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   359
      will be executed in this object's context
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   360
    @static
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   361
    */
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   362
    css: function (urls, callback, obj, context) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   363
      load('css', urls, callback, obj, context);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   364
    },
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   365
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   366
    /**
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   367
    Requests the specified JavaScript URL or URLs and executes the specified
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   368
    callback (if any) when they have finished loading. If an array of URLs is
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   369
    specified and the browser supports it, the scripts will be loaded in
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   370
    parallel and the callback will be executed after all scripts have
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   371
    finished loading.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   372
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   373
    Currently, only Firefox and Opera support parallel loading of scripts while
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   374
    preserving execution order. In other browsers, scripts will be
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   375
    queued and loaded one at a time to ensure correct execution order.
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   376
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   377
    @method js
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   378
    @param {String|Array} urls JS URL or array of JS URLs to load
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   379
    @param {Function} callback (optional) callback function to execute when
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   380
      the specified scripts are loaded
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   381
    @param {Object} obj (optional) object to pass to the callback function
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   382
    @param {Object} context (optional) if provided, the callback function
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   383
      will be executed in this object's context
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   384
    @static
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   385
    */
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   386
    js: function (urls, callback, obj, context) {
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   387
      load('js', urls, callback, obj, context);
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   388
    }
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   389
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   390
  };
289725d025d9 replaced minified version by dev version.
hamidouk
parents:
diff changeset
   391
})(this.document);