aboutsummaryrefslogtreecommitdiff
path: root/includes/js/dojox/off/files.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojox/off/files.js')
-rw-r--r--includes/js/dojox/off/files.js454
1 files changed, 0 insertions, 454 deletions
diff --git a/includes/js/dojox/off/files.js b/includes/js/dojox/off/files.js
deleted file mode 100644
index 6c19ea0..0000000
--- a/includes/js/dojox/off/files.js
+++ /dev/null
@@ -1,454 +0,0 @@
-if(!dojo._hasResource["dojox.off.files"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.off.files"] = true;
-dojo.provide("dojox.off.files");
-
-// Author: Brad Neuberg, bkn3@columbia.edu, http://codinginparadise.org
-
-// summary:
-// Helps maintain resources that should be
-// available offline, such as CSS files.
-// description:
-// dojox.off.files makes it easy to indicate
-// what resources should be available offline,
-// such as CSS files, JavaScript, HTML, etc.
-dojox.off.files = {
- // versionURL: String
- // An optional file, that if present, records the version
- // of our bundle of files to make available offline. If this
- // file is present, and we are not currently debugging,
- // then we only refresh our offline files if the version has
- // changed.
- versionURL: "version.js",
-
- // listOfURLs: Array
- // For advanced usage; most developers can ignore this.
- // Our list of URLs that will be cached and made available
- // offline.
- listOfURLs: [],
-
- // refreshing: boolean
- // For advanced usage; most developers can ignore this.
- // Whether we are currently in the middle
- // of refreshing our list of offline files.
- refreshing: false,
-
- _cancelID: null,
-
- _error: false,
- _errorMessages: [],
- _currentFileIndex: 0,
- _store: null,
- _doSlurp: false,
-
- slurp: function(){
- // summary:
- // Autoscans the page to find all resources to
- // cache. This includes scripts, images, CSS, and hyperlinks
- // to pages that are in the same scheme/port/host as this
- // page. We also scan the embedded CSS of any stylesheets
- // to find @import statements and url()'s.
- // You should call this method from the top-level, outside of
- // any functions and before the page loads:
- //
- // <script>
- // dojo.require("dojox.sql");
- // dojo.require("dojox.off");
- // dojo.require("dojox.off.ui");
- // dojo.require("dojox.off.sync");
- //
- // // configure how we should work offline
- //
- // // set our application name
- // dojox.off.ui.appName = "Moxie";
- //
- // // automatically "slurp" the page and
- // // capture the resources we need offline
- // dojox.off.files.slurp();
- //
- // // tell Dojo Offline we are ready for it to initialize itself now
- // // that we have finished configuring it for our application
- // dojox.off.initialize();
- // </script>
- //
- // Note that inline styles on elements are not handled (i.e.
- // if you somehow have an inline style that uses a URL);
- // object and embed tags are not scanned since their format
- // differs based on type; and elements created by JavaScript
- // after page load are not found. For these you must manually
- // add them with a dojox.off.files.cache() method call.
-
- // just schedule the slurp once the page is loaded and
- // Dojo Offline is ready to slurp; dojox.off will call
- // our _slurp() method before indicating it is finished
- // loading
- this._doSlurp = true;
- },
-
- cache: function(urlOrList){ /* void */
- // summary:
- // Caches a file or list of files to be available offline. This
- // can either be a full URL, such as http://foobar.com/index.html,
- // or a relative URL, such as ../index.html. This URL is not
- // actually cached until dojox.off.sync.synchronize() is called.
- // urlOrList: String or Array[]
- // A URL of a file to cache or an Array of Strings of files to
- // cache
-
- //console.debug("dojox.off.files.cache, urlOrList="+urlOrList);
-
- if(dojo.isString(urlOrList)){
- var url = this._trimAnchor(urlOrList+"");
- if(!this.isAvailable(url)){
- this.listOfURLs.push(url);
- }
- }else if(urlOrList instanceof dojo._Url){
- var url = this._trimAnchor(urlOrList.uri);
- if(!this.isAvailable(url)){
- this.listOfURLs.push(url);
- }
- }else{
- dojo.forEach(urlOrList, function(url){
- url = this._trimAnchor(url);
- if(!this.isAvailable(url)){
- this.listOfURLs.push(url);
- }
- }, this);
- }
- },
-
- printURLs: function(){
- // summary:
- // A helper function that will dump and print out
- // all of the URLs that are cached for offline
- // availability. This can help with debugging if you
- // are trying to make sure that all of your URLs are
- // available offline
- console.debug("The following URLs are cached for offline use:");
- dojo.forEach(this.listOfURLs, function(i){
- console.debug(i);
- });
- },
-
- remove: function(url){ /* void */
- // summary:
- // Removes a URL from the list of files to cache.
- // description:
- // Removes a URL from the list of URLs to cache. Note that this
- // does not actually remove the file from the offline cache;
- // instead, it just prevents us from refreshing this file at a
- // later time, so that it will naturally time out and be removed
- // from the offline cache
- // url: String
- // The URL to remove
- for(var i = 0; i < this.listOfURLs.length; i++){
- if(this.listOfURLs[i] == url){
- this.listOfURLs = this.listOfURLs.splice(i, 1);
- break;
- }
- }
- },
-
- isAvailable: function(url){ /* boolean */
- // summary:
- // Determines whether the given resource is available offline.
- // url: String
- // The URL to check
- for(var i = 0; i < this.listOfURLs.length; i++){
- if(this.listOfURLs[i] == url){
- return true;
- }
- }
-
- return false;
- },
-
- refresh: function(callback){ /* void */
- //console.debug("dojox.off.files.refresh");
- // summary:
- // For advanced usage; most developers can ignore this.
- // Refreshes our list of offline resources,
- // making them available offline.
- // callback: Function
- // A callback that receives two arguments: whether an error
- // occurred, which is a boolean; and an array of error message strings
- // with details on errors encountered. If no error occured then message is
- // empty array with length 0.
- try{
- if(dojo.config.isDebug){
- this.printURLs();
- }
-
- this.refreshing = true;
-
- if(this.versionURL){
- this._getVersionInfo(function(oldVersion, newVersion, justDebugged){
- //console.warn("getVersionInfo, oldVersion="+oldVersion+", newVersion="+newVersion
- // + ", justDebugged="+justDebugged+", isDebug="+dojo.config.isDebug);
- if(dojo.config.isDebug || !newVersion || justDebugged
- || !oldVersion || oldVersion != newVersion){
- console.warn("Refreshing offline file list");
- this._doRefresh(callback, newVersion);
- }else{
- console.warn("No need to refresh offline file list");
- callback(false, []);
- }
- });
- }else{
- console.warn("Refreshing offline file list");
- this._doRefresh(callback);
- }
- }catch(e){
- this.refreshing = false;
-
- // can't refresh files -- core operation --
- // fail fast
- dojox.off.coreOpFailed = true;
- dojox.off.enabled = false;
- dojox.off.onFrameworkEvent("coreOperationFailed");
- }
- },
-
- abortRefresh: function(){
- // summary:
- // For advanced usage; most developers can ignore this.
- // Aborts and cancels a refresh.
- if(!this.refreshing){
- return;
- }
-
- this._store.abortCapture(this._cancelID);
- this.refreshing = false;
- },
-
- _slurp: function(){
- if(!this._doSlurp){
- return;
- }
-
- var handleUrl = dojo.hitch(this, function(url){
- if(this._sameLocation(url)){
- this.cache(url);
- }
- });
-
- handleUrl(window.location.href);
-
- dojo.query("script").forEach(function(i){
- try{
- handleUrl(i.getAttribute("src"));
- }catch(exp){
- //console.debug("dojox.off.files.slurp 'script' error: "
- // + exp.message||exp);
- }
- });
-
- dojo.query("link").forEach(function(i){
- try{
- if(!i.getAttribute("rel")
- || i.getAttribute("rel").toLowerCase() != "stylesheet"){
- return;
- }
-
- handleUrl(i.getAttribute("href"));
- }catch(exp){
- //console.debug("dojox.off.files.slurp 'link' error: "
- // + exp.message||exp);
- }
- });
-
- dojo.query("img").forEach(function(i){
- try{
- handleUrl(i.getAttribute("src"));
- }catch(exp){
- //console.debug("dojox.off.files.slurp 'img' error: "
- // + exp.message||exp);
- }
- });
-
- dojo.query("a").forEach(function(i){
- try{
- handleUrl(i.getAttribute("href"));
- }catch(exp){
- //console.debug("dojox.off.files.slurp 'a' error: "
- // + exp.message||exp);
- }
- });
-
- // FIXME: handle 'object' and 'embed' tag
-
- // parse our style sheets for inline URLs and imports
- dojo.forEach(document.styleSheets, function(sheet){
- try{
- if(sheet.cssRules){ // Firefox
- dojo.forEach(sheet.cssRules, function(rule){
- var text = rule.cssText;
- if(text){
- var matches = text.match(/url\(\s*([^\) ]*)\s*\)/i);
- if(!matches){
- return;
- }
-
- for(var i = 1; i < matches.length; i++){
- handleUrl(matches[i])
- }
- }
- });
- }else if(sheet.cssText){ // IE
- var matches;
- var text = sheet.cssText.toString();
- // unfortunately, using RegExp.exec seems to be flakey
- // for looping across multiple lines on IE using the
- // global flag, so we have to simulate it
- var lines = text.split(/\f|\r|\n/);
- for(var i = 0; i < lines.length; i++){
- matches = lines[i].match(/url\(\s*([^\) ]*)\s*\)/i);
- if(matches && matches.length){
- handleUrl(matches[1]);
- }
- }
- }
- }catch(exp){
- //console.debug("dojox.off.files.slurp stylesheet parse error: "
- // + exp.message||exp);
- }
- });
-
- //this.printURLs();
- },
-
- _sameLocation: function(url){
- if(!url){ return false; }
-
- // filter out anchors
- if(url.length && url.charAt(0) == "#"){
- return false;
- }
-
- // FIXME: dojo._Url should be made public;
- // it's functionality is very useful for
- // parsing URLs correctly, which is hard to
- // do right
- url = new dojo._Url(url);
-
- // totally relative -- ../../someFile.html
- if(!url.scheme && !url.port && !url.host){
- return true;
- }
-
- // scheme relative with port specified -- brad.com:8080
- if(!url.scheme && url.host && url.port
- && window.location.hostname == url.host
- && window.location.port == url.port){
- return true;
- }
-
- // scheme relative with no-port specified -- brad.com
- if(!url.scheme && url.host && !url.port
- && window.location.hostname == url.host
- && window.location.port == 80){
- return true;
- }
-
- // else we have everything
- return window.location.protocol == (url.scheme + ":")
- && window.location.hostname == url.host
- && (window.location.port == url.port || !window.location.port && !url.port);
- },
-
- _trimAnchor: function(url){
- return url.replace(/\#.*$/, "");
- },
-
- _doRefresh: function(callback, newVersion){
- // get our local server
- var localServer;
- try{
- localServer = google.gears.factory.create("beta.localserver", "1.0");
- }catch(exp){
- dojo.setObject("google.gears.denied", true);
- dojox.off.onFrameworkEvent("coreOperationFailed");
- throw "Google Gears must be allowed to run";
- }
-
- var storeName = "dot_store_"
- + window.location.href.replace(/[^0-9A-Za-z_]/g, "_");
-
- // clip at 64 characters, the max length of a resource store name
- if(storeName.length >= 64){
- storeName = storeName.substring(0, 63);
- }
-
- // refresh everything by simply removing
- // any older stores
- localServer.removeStore(storeName);
-
- // open/create the resource store
- localServer.openStore(storeName);
- var store = localServer.createStore(storeName);
- this._store = store;
-
- // add our list of files to capture
- var self = this;
- this._currentFileIndex = 0;
- this._cancelID = store.capture(this.listOfURLs, function(url, success, captureId){
- //console.debug("store.capture, url="+url+", success="+success);
- if(!success && self.refreshing){
- self._cancelID = null;
- self.refreshing = false;
- var errorMsgs = [];
- errorMsgs.push("Unable to capture: " + url);
- callback(true, errorMsgs);
- return;
- }else if(success){
- self._currentFileIndex++;
- }
-
- if(success && self._currentFileIndex >= self.listOfURLs.length){
- self._cancelID = null;
- self.refreshing = false;
- if(newVersion){
- dojox.storage.put("oldVersion", newVersion, null,
- dojox.off.STORAGE_NAMESPACE);
- }
- dojox.storage.put("justDebugged", dojo.config.isDebug, null,
- dojox.off.STORAGE_NAMESPACE);
- callback(false, []);
- }
- });
- },
-
- _getVersionInfo: function(callback){
- var justDebugged = dojox.storage.get("justDebugged",
- dojox.off.STORAGE_NAMESPACE);
- var oldVersion = dojox.storage.get("oldVersion",
- dojox.off.STORAGE_NAMESPACE);
- var newVersion = null;
-
- callback = dojo.hitch(this, callback);
-
- dojo.xhrGet({
- url: this.versionURL + "?browserbust=" + new Date().getTime(),
- timeout: 5 * 1000,
- handleAs: "javascript",
- error: function(err){
- //console.warn("dojox.off.files._getVersionInfo, err=",err);
- dojox.storage.remove("oldVersion", dojox.off.STORAGE_NAMESPACE);
- dojox.storage.remove("justDebugged", dojox.off.STORAGE_NAMESPACE);
- callback(oldVersion, newVersion, justDebugged);
- },
- load: function(data){
- //console.warn("dojox.off.files._getVersionInfo, load=",data);
-
- // some servers incorrectly return 404's
- // as a real page
- if(data){
- newVersion = data;
- }
-
- callback(oldVersion, newVersion, justDebugged);
- }
- });
- }
-}
-
-}