!function (doc) {
  var loaded = 0, fns = [], ol, f = false,
      testEl = doc.createElement('a'),
      domContentLoaded = 'DOMContentLoaded',
      addEventListener = 'addEventListener',
      onreadystatechange = 'onreadystatechange';

  /^loade|c/.test(doc.readyState) && (loaded = 1);

  function flush() {
    loaded = 1;
    for (var i = 0, l = fns.length; i < l; i++) {
      fns[i]();
    }
  }
  doc[addEventListener] && doc[addEventListener](domContentLoaded, function fn() {
    doc.removeEventListener(domContentLoaded, fn, f);
    flush();
  }, f);


  testEl.doScroll && doc.attachEvent(onreadystatechange, (ol = function ol() {
    if (/^c/.test(doc.readyState)) {
      doc.detachEvent(onreadystatechange, ol);
      flush();
    }
  }));

  var domReady = testEl.doScroll ?
    function (fn) {
      self != top ?
        !loaded ?
          fns.push(fn) :
          fn() :
        !function () {
          try {
            testEl.doScroll('left');
          } catch (e) {
            return setTimeout(function() {
              domReady(fn);
            }, 50);
          }
          fn();
        }();
    } :
    function (fn) {
      loaded ? fn() : fns.push(fn);
    };

    (typeof module !== 'undefined') && module.exports ?
      (module.exports = {domReady: domReady}) :
      (window.domReady = domReady);

}(document);


!function (win, doc, timeout) {
	var head = doc.getElementsByTagName('head')[0],
		list = {},
		ids = {},
		delay = {},
		scripts = {},
		s = 'string',
		f = false,
		push = 'push',
		domContentLoaded = 'DOMContentLoaded',
		readyState = 'readyState',
		addEventListener = 'addEventListener',
		onreadystatechange = 'onreadystatechange',
		every = function (ar, fn) {
			for (var i = 0, j = ar.length; i < j; ++i) {
				if (!fn(ar[i])) {
					return f;
				}
			}
			return 1;
		};

	function each(ar, fn) {
		every(ar, function (el) {
			return !fn(el);
		});
	}

	if (!doc[readyState] && doc[addEventListener]) {
		doc[addEventListener](domContentLoaded, function fn() {
			doc.removeEventListener(domContentLoaded, fn, f);
			doc[readyState] = "complete";
		}, f);
		doc[readyState] = "loading";
	}

	var $script = function (paths, idOrDone, optDone) {
			paths = paths[push] ? paths : [paths];
			var idOrDoneIsDone = idOrDone && idOrDone.call,
				done = idOrDoneIsDone ? idOrDone : optDone,
				id = idOrDoneIsDone ? paths.join('') : idOrDone,
				queue = paths.length;

			function loopFn(item) {
				return item.call ? item() : list[item];
			}

			function callback() {
				if (!--queue) {
					list[id] = 1;
					done && done();
					for (var dset in delay) {
						every(dset.split('|'), loopFn) && !each(delay[dset], loopFn) && (delay[dset] = []);
					}
				}
			}
			timeout(function () {
				each(paths, function (path) {
					if (scripts[path]) {
						id && (ids[id] = 1);
						callback();
						return;
					}
					scripts[path] = 1;
					id && (ids[id] = 1);
					create($script.path ? $script.path + path + '.js' : path, callback);
				});
			}, 0);
			return $script;
		};

	function create(path, fn) {
		var el = doc.createElement("script"),
			loaded = f;
		el.onload = el.onerror = el[onreadystatechange] = function () {
			if ((el[readyState] && !(/^c|loade/.test(el[readyState]))) || loaded) {
				return;
			}
			el.onload = el[onreadystatechange] = null;
			loaded = 1;
			fn();
		};
		el.async = 1;
		el.src = path;
		head.insertBefore(el, head.firstChild);
	}

	$script.get = create;

	$script.ready = function (deps, ready, req) {
		deps = deps[push] ? deps : [deps];
		var missing = [];
		!each(deps, function (dep) {
			list[dep] || missing[push](dep);
		}) && every(deps, function (dep) {
			return list[dep];
		}) ? ready() : !
		function (key) {
			delay[key] = delay[key] || [];
			delay[key][push](ready);
			req && req(missing);
		}(deps.join('|'));
		return $script;
	};

	var old = win.$script;
	$script.noConflict = function () {
		win.$script = old;
		return this;
	};

	(typeof module !== 'undefined' && module.exports) ? (module.exports = $script) : (win['$script'] = $script);

}(this, document, setTimeout);
