/* ----------------------------------------------------------- dom.loadScript.js : 0.1.4 : 2014/02/12 : http://mudcu.be ----------------------------------------------------------- Copyright 2011-2014 Mudcube. All rights reserved. ----------------------------------------------------------- /// No verification dom.loadScript.add("../js/jszip/jszip.js"); /// Strict loading order and verification. dom.loadScript.add({ strictOrder: true, urls: [ { url: "../js/jszip/jszip.js", verify: "JSZip", onsuccess: function() { console.log(1) } }, { url: "../inc/downloadify/js/swfobject.js", verify: "swfobject", onsuccess: function() { console.log(2) } } ], onsuccess: function() { console.log(3) } }); /// Just verification. dom.loadScript.add({ url: "../js/jszip/jszip.js", verify: "JSZip", onsuccess: function() { console.log(1) } }); */ if (typeof(dom) === "undefined") var dom = {}; (function() { "use strict"; dom.loadScript = function() { this.loaded = {}; this.loading = {}; return this; }; dom.loadScript.prototype.add = function(config) { var that = this; if (typeof(config) === "string") { config = { url: config }; } var urls = config.urls; if (typeof(urls) === "undefined") { urls = [{ url: config.url, verify: config.verify }]; } /// adding the elements to the head var doc = document.getElementsByTagName("head")[0]; /// var testElement = function(element, test) { if (that.loaded[element.url]) return; if (test && globalExists(test) === false) return; that.loaded[element.url] = true; // if (that.loading[element.url]) that.loading[element.url](); delete that.loading[element.url]; // if (element.onsuccess) element.onsuccess(); if (typeof(getNext) !== "undefined") getNext(); }; /// var hasError = false; var batchTest = []; var addElement = function(element) { if (typeof(element) === "string") { element = { url: element, verify: config.verify }; } if (/([\w\d.\[\]\'\"])$/.test(element.verify)) { // check whether its a variable reference var verify = element.test = element.verify; if (typeof(verify) === "object") { for (var n = 0; n < verify.length; n ++) { batchTest.push(verify[n]); } } else { batchTest.push(verify); } } if (that.loaded[element.url]) return; var script = document.createElement("script"); script.onreadystatechange = function() { if (this.readyState !== "loaded" && this.readyState !== "complete") return; testElement(element); }; script.onload = function() { testElement(element); }; script.onerror = function() { hasError = true; delete that.loading[element.url]; if (typeof(element.test) === "object") { for (var key in element.test) { removeTest(element.test[key]); } } else { removeTest(element.test); } }; script.setAttribute("type", "text/javascript"); script.setAttribute("src", element.url); doc.appendChild(script); that.loading[element.url] = function() {}; }; /// checking to see whether everything loaded properly var removeTest = function(test) { var ret = []; for (var n = 0; n < batchTest.length; n ++) { if (batchTest[n] === test) continue; ret.push(batchTest[n]); } batchTest = ret; }; var onLoad = function(element) { if (element) { testElement(element, element.test); } else { for (var n = 0; n < urls.length; n ++) { testElement(urls[n], urls[n].test); } } var istrue = true; for (var n = 0; n < batchTest.length; n ++) { if (globalExists(batchTest[n]) === false) { istrue = false; } } if (!config.strictOrder && istrue) { // finished loading all the requested scripts if (hasError) { if (config.error) { config.error(); } } else if (config.onsuccess) { config.onsuccess(); } } else { // keep calling back the function setTimeout(function() { //- should get slower over time? onLoad(element); }, 10); } }; /// loading methods; strict ordering or loose ordering if (config.strictOrder) { var ID = -1; var getNext = function() { ID ++; if (!urls[ID]) { // all elements are loaded if (hasError) { if (config.error) { config.error(); } } else if (config.onsuccess) { config.onsuccess(); } } else { // loading new script var element = urls[ID]; var url = element.url; if (that.loading[url]) { // already loading from another call (attach to event) that.loading[url] = function() { if (element.onsuccess) element.onsuccess(); getNext(); } } else if (!that.loaded[url]) { // create script element addElement(element); onLoad(element); } else { // it's already been successfully loaded getNext(); } } }; getNext(); } else { // loose ordering for (var ID = 0; ID < urls.length; ID ++) { addElement(urls[ID]); onLoad(urls[ID]); } } }; dom.loadScript = new dom.loadScript(); var globalExists = function(path, root) { try { path = path.split('"').join('').split("'").join('').split(']').join('').split('[').join('.'); var parts = path.split("."); var length = parts.length; var object = root || window; for (var n = 0; n < length; n ++) { var key = parts[n]; if (object[key] == null) { return false; } else { // object = object[key]; } } return true; } catch(e) { return false; } }; })(); /// For NodeJS if (typeof (module) !== "undefined" && module.exports) { module.exports = dom.loadScript; }