380 lines
12 KiB
JavaScript
380 lines
12 KiB
JavaScript
|
/*=====
|
||
|
dojo.isBrowser = {
|
||
|
// example:
|
||
|
// | if(dojo.isBrowser){ ... }
|
||
|
};
|
||
|
|
||
|
dojo.isFF = {
|
||
|
// example:
|
||
|
// | if(dojo.isFF > 1){ ... }
|
||
|
};
|
||
|
|
||
|
dojo.isIE = {
|
||
|
// example:
|
||
|
// | if(dojo.isIE > 6){
|
||
|
// | // we are IE7
|
||
|
// | }
|
||
|
};
|
||
|
|
||
|
dojo.isSafari = {
|
||
|
// example:
|
||
|
// | if(dojo.isSafari){ ... }
|
||
|
// example:
|
||
|
// Detect iPhone:
|
||
|
// | if(dojo.isSafari && (navigator.userAgent.indexOf("iPhone") < 0)){
|
||
|
// | // we are iPhone. iPod touch reports "iPod" above
|
||
|
// | }
|
||
|
};
|
||
|
|
||
|
dojo = {
|
||
|
// isBrowser: Boolean
|
||
|
// True if the client is a web-browser
|
||
|
isBrowser: true,
|
||
|
// isFF: Number
|
||
|
// Greater than zero if client is FireFox. 0 otherwise. Corresponds to
|
||
|
// major detected FireFox version (1.5, 2, 3, etc.)
|
||
|
isFF: 2,
|
||
|
// isIE: Number
|
||
|
// Greater than zero if client is MSIE(PC). 0 otherwise. Corresponds to
|
||
|
// major detected IE version (6, 7, 8, etc.)
|
||
|
isIE: 6,
|
||
|
// isKhtml: Number
|
||
|
// Greater than zero if client is a KTHML-derived browser (Konqueror,
|
||
|
// Safari, etc.). 0 otherwise. Corresponds to major detected version.
|
||
|
isKhtml: 0,
|
||
|
// isMozilla: Number
|
||
|
// Greater than zero if client is a Mozilla-based browser (Firefox,
|
||
|
// SeaMonkey). 0 otherwise. Corresponds to major detected version.
|
||
|
isMozilla: 0,
|
||
|
// isOpera: Number
|
||
|
// Greater than zero if client is Opera. 0 otherwise. Corresponds to
|
||
|
// major detected version.
|
||
|
isOpera: 0,
|
||
|
// isSafari: Number
|
||
|
// Greater than zero if client is Safari or iPhone. 0 otherwise.
|
||
|
isSafari: 0
|
||
|
}
|
||
|
=====*/
|
||
|
|
||
|
if(typeof window != 'undefined'){
|
||
|
dojo.isBrowser = true;
|
||
|
dojo._name = "browser";
|
||
|
|
||
|
|
||
|
// attempt to figure out the path to dojo if it isn't set in the config
|
||
|
(function(){
|
||
|
var d = dojo;
|
||
|
// this is a scope protection closure. We set browser versions and grab
|
||
|
// the URL we were loaded from here.
|
||
|
|
||
|
// grab the node we were loaded from
|
||
|
if(document && document.getElementsByTagName){
|
||
|
var scripts = document.getElementsByTagName("script");
|
||
|
var rePkg = /dojo(\.xd)?\.js(\W|$)/i;
|
||
|
for(var i = 0; i < scripts.length; i++){
|
||
|
var src = scripts[i].getAttribute("src");
|
||
|
if(!src){ continue; }
|
||
|
var m = src.match(rePkg);
|
||
|
if(m){
|
||
|
// find out where we came from
|
||
|
if(!d.config.baseUrl){
|
||
|
d.config.baseUrl = src.substring(0, m.index);
|
||
|
}
|
||
|
// and find out if we need to modify our behavior
|
||
|
var cfg = scripts[i].getAttribute("djConfig");
|
||
|
if(cfg){
|
||
|
var cfgo = eval("({ "+cfg+" })");
|
||
|
for(var x in cfgo){
|
||
|
dojo.config[x] = cfgo[x];
|
||
|
}
|
||
|
}
|
||
|
break; // "first Dojo wins"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
d.baseUrl = d.config.baseUrl;
|
||
|
|
||
|
// fill in the rendering support information in dojo.render.*
|
||
|
var n = navigator;
|
||
|
var dua = n.userAgent;
|
||
|
var dav = n.appVersion;
|
||
|
var tv = parseFloat(dav);
|
||
|
|
||
|
d.isOpera = (dua.indexOf("Opera") >= 0) ? tv : 0;
|
||
|
// safari detection derived from:
|
||
|
// http://developer.apple.com/internet/safari/faq.html#anchor2
|
||
|
// http://developer.apple.com/internet/safari/uamatrix.html
|
||
|
var idx = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);
|
||
|
if(idx){
|
||
|
// try to grab the explicit Safari version first. If we don't get
|
||
|
// one, look for 419.3+ as the indication that we're on something
|
||
|
// "Safari 3-ish". Lastly, default to "Safari 2" handling.
|
||
|
d.isSafari = parseFloat(dav.split("Version/")[1]) || ( ( parseFloat(dav.substr(idx+7)) >= 419.3 ) ? 3 : 2 ) || 2;
|
||
|
}
|
||
|
d.isAIR = (dua.indexOf("AdobeAIR") >= 0) ? 1 : 0;
|
||
|
d.isKhtml = (dav.indexOf("Konqueror") >= 0 || d.isSafari) ? tv : 0;
|
||
|
d.isMozilla = d.isMoz = (dua.indexOf("Gecko") >= 0 && !d.isKhtml) ? tv : 0;
|
||
|
d.isFF = d.isIE = 0;
|
||
|
if(d.isMoz){
|
||
|
d.isFF = parseFloat(dua.split("Firefox/")[1]) || 0;
|
||
|
}
|
||
|
if(document.all && !d.isOpera){
|
||
|
d.isIE = parseFloat(dav.split("MSIE ")[1]) || 0;
|
||
|
}
|
||
|
|
||
|
//Workaround to get local file loads of dojo to work on IE 7
|
||
|
//by forcing to not use native xhr.
|
||
|
if(dojo.isIE && window.location.protocol === "file:"){
|
||
|
dojo.config.ieForceActiveXXhr=true;
|
||
|
}
|
||
|
|
||
|
var cm = document.compatMode;
|
||
|
d.isQuirks = cm == "BackCompat" || cm == "QuirksMode" || d.isIE < 6;
|
||
|
|
||
|
// TODO: is the HTML LANG attribute relevant?
|
||
|
d.locale = dojo.config.locale || (d.isIE ? n.userLanguage : n.language).toLowerCase();
|
||
|
|
||
|
// These are in order of decreasing likelihood; this will change in time.
|
||
|
d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
|
||
|
|
||
|
d._xhrObj = function(){
|
||
|
// summary:
|
||
|
// does the work of portably generating a new XMLHTTPRequest
|
||
|
// object.
|
||
|
var http = null;
|
||
|
var last_e = null;
|
||
|
if(!dojo.isIE || !dojo.config.ieForceActiveXXhr){
|
||
|
try{ http = new XMLHttpRequest(); }catch(e){}
|
||
|
}
|
||
|
if(!http){
|
||
|
for(var i=0; i<3; ++i){
|
||
|
var progid = d._XMLHTTP_PROGIDS[i];
|
||
|
try{
|
||
|
http = new ActiveXObject(progid);
|
||
|
}catch(e){
|
||
|
last_e = e;
|
||
|
}
|
||
|
|
||
|
if(http){
|
||
|
d._XMLHTTP_PROGIDS = [progid]; // so faster next time
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(!http){
|
||
|
throw new Error("XMLHTTP not available: "+last_e);
|
||
|
}
|
||
|
|
||
|
return http; // XMLHTTPRequest instance
|
||
|
}
|
||
|
|
||
|
d._isDocumentOk = function(http){
|
||
|
var stat = http.status || 0;
|
||
|
return (stat >= 200 && stat < 300) || // Boolean
|
||
|
stat == 304 || // allow any 2XX response code
|
||
|
stat == 1223 || // get it out of the cache
|
||
|
(!stat && (location.protocol=="file:" || location.protocol=="chrome:") ); // Internet Explorer mangled the status code
|
||
|
}
|
||
|
|
||
|
//See if base tag is in use.
|
||
|
//This is to fix http://trac.dojotoolkit.org/ticket/3973,
|
||
|
//but really, we need to find out how to get rid of the dojo._Url reference
|
||
|
//below and still have DOH work with the dojo.i18n test following some other
|
||
|
//test that uses the test frame to load a document (trac #2757).
|
||
|
//Opera still has problems, but perhaps a larger issue of base tag support
|
||
|
//with XHR requests (hasBase is true, but the request is still made to document
|
||
|
//path, not base path).
|
||
|
var owloc = window.location+"";
|
||
|
var base = document.getElementsByTagName("base");
|
||
|
var hasBase = (base && base.length > 0);
|
||
|
|
||
|
d._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){
|
||
|
// summary: Read the contents of the specified uri and return those contents.
|
||
|
// uri:
|
||
|
// A relative or absolute uri. If absolute, it still must be in
|
||
|
// the same "domain" as we are.
|
||
|
// fail_ok:
|
||
|
// Default false. If fail_ok and loading fails, return null
|
||
|
// instead of throwing.
|
||
|
// returns: The response text. null is returned when there is a
|
||
|
// failure and failure is okay (an exception otherwise)
|
||
|
|
||
|
// alert("_getText: " + uri);
|
||
|
|
||
|
// NOTE: must be declared before scope switches ie. this._xhrObj()
|
||
|
var http = this._xhrObj();
|
||
|
|
||
|
if(!hasBase && dojo._Url){
|
||
|
uri = (new dojo._Url(owloc, uri)).toString();
|
||
|
}
|
||
|
/*
|
||
|
console.debug("_getText:", uri);
|
||
|
console.debug(window.location+"");
|
||
|
alert(uri);
|
||
|
*/
|
||
|
|
||
|
if(d.config.cacheBust){
|
||
|
uri += (uri.indexOf("?") == -1 ? "?" : "&") + String(d.config.cacheBust).replace(/\W+/g,"");
|
||
|
}
|
||
|
|
||
|
http.open('GET', uri, false);
|
||
|
try{
|
||
|
http.send(null);
|
||
|
// alert(http);
|
||
|
if(!d._isDocumentOk(http)){
|
||
|
var err = Error("Unable to load "+uri+" status:"+ http.status);
|
||
|
err.status = http.status;
|
||
|
err.responseText = http.responseText;
|
||
|
throw err;
|
||
|
}
|
||
|
}catch(e){
|
||
|
if(fail_ok){ return null; } // null
|
||
|
// rethrow the exception
|
||
|
throw e;
|
||
|
}
|
||
|
return http.responseText; // String
|
||
|
}
|
||
|
})();
|
||
|
|
||
|
dojo._initFired = false;
|
||
|
// BEGIN DOMContentLoaded, from Dean Edwards (http://dean.edwards.name/weblog/2006/06/again/)
|
||
|
dojo._loadInit = function(e){
|
||
|
dojo._initFired = true;
|
||
|
// allow multiple calls, only first one will take effect
|
||
|
// A bug in khtml calls events callbacks for document for event which isnt supported
|
||
|
// for example a created contextmenu event calls DOMContentLoaded, workaround
|
||
|
var type = (e && e.type) ? e.type.toLowerCase() : "load";
|
||
|
if(arguments.callee.initialized || (type != "domcontentloaded" && type != "load")){ return; }
|
||
|
arguments.callee.initialized = true;
|
||
|
if("_khtmlTimer" in dojo){
|
||
|
clearInterval(dojo._khtmlTimer);
|
||
|
delete dojo._khtmlTimer;
|
||
|
}
|
||
|
|
||
|
if(dojo._inFlightCount == 0){
|
||
|
dojo._modulesLoaded();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dojo._fakeLoadInit = function(){
|
||
|
dojo._loadInit({type: "load"});
|
||
|
}
|
||
|
|
||
|
if(!dojo.config.afterOnLoad){
|
||
|
// START DOMContentLoaded
|
||
|
// Mozilla and Opera 9 expose the event we could use
|
||
|
if(document.addEventListener){
|
||
|
// NOTE:
|
||
|
// due to a threading issue in Firefox 2.0, we can't enable
|
||
|
// DOMContentLoaded on that platform. For more information, see:
|
||
|
// http://trac.dojotoolkit.org/ticket/1704
|
||
|
if(dojo.isOpera || dojo.isFF >= 3 || (dojo.isMoz && dojo.config.enableMozDomContentLoaded === true)){
|
||
|
document.addEventListener("DOMContentLoaded", dojo._loadInit, null);
|
||
|
}
|
||
|
|
||
|
// mainly for Opera 8.5, won't be fired if DOMContentLoaded fired already.
|
||
|
// also used for Mozilla because of trac #1640
|
||
|
window.addEventListener("load", dojo._loadInit, null);
|
||
|
}
|
||
|
|
||
|
if(dojo.isAIR){
|
||
|
window.addEventListener("load", dojo._loadInit, null);
|
||
|
}else if(/(WebKit|khtml)/i.test(navigator.userAgent)){ // sniff
|
||
|
dojo._khtmlTimer = setInterval(function(){
|
||
|
if(/loaded|complete/.test(document.readyState)){
|
||
|
dojo._loadInit(); // call the onload handler
|
||
|
}
|
||
|
}, 10);
|
||
|
}
|
||
|
// END DOMContentLoaded
|
||
|
}
|
||
|
|
||
|
(function(){
|
||
|
var _w = window;
|
||
|
var _handleNodeEvent = function(/*String*/evtName, /*Function*/fp){
|
||
|
// summary:
|
||
|
// non-destructively adds the specified function to the node's
|
||
|
// evtName handler.
|
||
|
// evtName: should be in the form "onclick" for "onclick" handlers.
|
||
|
// Make sure you pass in the "on" part.
|
||
|
var oldHandler = _w[evtName] || function(){};
|
||
|
_w[evtName] = function(){
|
||
|
fp.apply(_w, arguments);
|
||
|
oldHandler.apply(_w, arguments);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
if(dojo.isIE){
|
||
|
// for Internet Explorer. readyState will not be achieved on init
|
||
|
// call, but dojo doesn't need it however, we'll include it
|
||
|
// because we don't know if there are other functions added that
|
||
|
// might. Note that this has changed because the build process
|
||
|
// strips all comments -- including conditional ones.
|
||
|
if(!dojo.config.afterOnLoad){
|
||
|
document.write('<scr'+'ipt defer src="//:" '
|
||
|
+ 'onreadystatechange="if(this.readyState==\'complete\'){' + dojo._scopeName + '._loadInit();}">'
|
||
|
+ '</scr'+'ipt>'
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// IE WebControl hosted in an application can fire "beforeunload" and "unload"
|
||
|
// events when control visibility changes, causing Dojo to unload too soon. The
|
||
|
// following code fixes the problem
|
||
|
// Reference: http://support.microsoft.com/default.aspx?scid=kb;en-us;199155
|
||
|
var _unloading = true;
|
||
|
_handleNodeEvent("onbeforeunload", function(){
|
||
|
_w.setTimeout(function(){ _unloading = false; }, 0);
|
||
|
});
|
||
|
_handleNodeEvent("onunload", function(){
|
||
|
if(_unloading){ dojo.unloaded(); }
|
||
|
});
|
||
|
|
||
|
try{
|
||
|
document.namespaces.add("v","urn:schemas-microsoft-com:vml");
|
||
|
document.createStyleSheet().addRule("v\\:*", "behavior:url(#default#VML)");
|
||
|
}catch(e){}
|
||
|
}else{
|
||
|
// FIXME: dojo.unloaded requires dojo scope, so using anon function wrapper.
|
||
|
_handleNodeEvent("onbeforeunload", function() { dojo.unloaded(); });
|
||
|
}
|
||
|
|
||
|
})();
|
||
|
|
||
|
/*
|
||
|
OpenAjax.subscribe("OpenAjax", "onload", function(){
|
||
|
if(dojo._inFlightCount == 0){
|
||
|
dojo._modulesLoaded();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
OpenAjax.subscribe("OpenAjax", "onunload", function(){
|
||
|
dojo.unloaded();
|
||
|
});
|
||
|
*/
|
||
|
} //if (typeof window != 'undefined')
|
||
|
|
||
|
//Register any module paths set up in djConfig. Need to do this
|
||
|
//in the hostenvs since hostenv_browser can read djConfig from a
|
||
|
//script tag's attribute.
|
||
|
(function(){
|
||
|
var mp = dojo.config["modulePaths"];
|
||
|
if(mp){
|
||
|
for(var param in mp){
|
||
|
dojo.registerModulePath(param, mp[param]);
|
||
|
}
|
||
|
}
|
||
|
})();
|
||
|
|
||
|
//Load debug code if necessary.
|
||
|
if(dojo.config.isDebug){
|
||
|
dojo.require("dojo._firebug.firebug");
|
||
|
}
|
||
|
|
||
|
if(dojo.config.debugAtAllCosts){
|
||
|
dojo.config.useXDomain = true;
|
||
|
dojo.require("dojo._base._loader.loader_xd");
|
||
|
dojo.require("dojo._base._loader.loader_debug");
|
||
|
dojo.require("dojo.i18n");
|
||
|
}
|