Path: blob/master/webroot/rsrc/externals/javelin/lib/Resource.js
12242 views
/**1* @provides javelin-resource2* @requires javelin-util3* javelin-uri4* javelin-install5*6* @javelin7*/89JX.install('Resource', {1011statics: {1213_loading: {},14_loaded: {},15_links: [],16_callbacks: [],1718/**19* Loads one or many static resources (JavaScript or CSS) and executes a20* callback once these resources have finished loading.21*22* @param string|array static resource or list of resources to be loaded23* @param function callback when resources have finished loading24*/25load: function(list, callback) {26var resources = {},27uri, resource, path;2829list = JX.$AX(list);3031// In the event there are no resources to wait on, call the callback and32// exit. NOTE: it's better to do this check outside this function and not33// call through JX.Resource, but it's not always easy/possible to do so34if (!list.length) {35setTimeout(callback, 0);36return;37}3839for (var ii = 0; ii < list.length; ii++) {40uri = new JX.URI(list[ii]);41resource = uri.toString();42path = uri.getPath();43resources[resource] = true;4445if (JX.Resource._loaded[resource]) {46setTimeout(JX.bind(JX.Resource, JX.Resource._complete, resource), 0);47} else if (!JX.Resource._loading[resource]) {48JX.Resource._loading[resource] = true;49if (path.indexOf('.css') == path.length - 4) {50JX.Resource._loadCSS(resource);51} else {52JX.Resource._loadJS(resource);53}54}55}5657JX.Resource._callbacks.push({58resources: resources,59callback: callback60});61},6263_loadJS: function(uri) {64var script = document.createElement('script');65var load_callback = function() {66JX.Resource._complete(uri);67};68var error_callback = function() {69JX.$E('Resource: JS file download failure: ' + uri);70};7172JX.copy(script, {73type: 'text/javascript',74src: uri75});7677script.onload = load_callback;78script.onerror = error_callback;79script.onreadystatechange = function() {80var state = this.readyState;81if (state == 'complete' || state == 'loaded') {82load_callback();83}84};85document.getElementsByTagName('head')[0].appendChild(script);86},8788_loadCSS: function(uri) {89var link = JX.copy(document.createElement('link'), {90type: 'text/css',91rel: 'stylesheet',92href: uri,93'data-href': uri // don't trust href94});95document.getElementsByTagName('head')[0].appendChild(link);9697JX.Resource._links.push(link);98if (!JX.Resource._timer) {99JX.Resource._timer = setInterval(JX.Resource._poll, 20);100}101},102103_poll: function() {104var sheets = document.styleSheets,105ii = sheets.length,106links = JX.Resource._links;107108// Cross Origin CSS loading109// http://yearofmoo.com/2011/03/cross-browser-stylesheet-preloading/110while (ii--) {111var link = sheets[ii],112owner = link.ownerNode || link.owningElement,113jj = links.length;114if (owner) {115while (jj--) {116if (owner == links[jj]) {117JX.Resource._complete(links[jj]['data-href']);118links.splice(jj, 1);119}120}121}122}123124if (!links.length) {125clearInterval(JX.Resource._timer);126JX.Resource._timer = null;127}128},129130_complete: function(uri) {131var list = JX.Resource._callbacks,132current, ii;133134delete JX.Resource._loading[uri];135JX.Resource._loaded[uri] = true;136137var errors = [];138for (ii = 0; ii < list.length; ii++) {139current = list[ii];140delete current.resources[uri];141if (!JX.Resource._hasResources(current.resources)) {142try {143current.callback();144} catch (error) {145errors.push(error);146}147list.splice(ii--, 1);148}149}150151for (var jj = 0; jj < errors.length; jj++) {152JX.log(errors[jj]);153}154155if (errors.length) {156throw errors[0];157}158},159160_hasResources: function(resources) {161for (var hasResources in resources) {162return true;163}164return false;165}166167},168169initialize: function() {170var list = JX.$A(document.getElementsByTagName('link')),171ii = list.length,172node;173while ((node = list[--ii])) {174if (node.type == 'text/css' && node.href) {175JX.Resource._loaded[(new JX.URI(node.href)).toString()] = true;176}177}178179list = JX.$A(document.getElementsByTagName('script'));180ii = list.length;181while ((node = list[--ii])) {182if (node.type == 'text/javascript' && node.src) {183JX.Resource._loaded[(new JX.URI(node.src)).toString()] = true;184}185}186}187188});189190191