360 lines
10 KiB
JavaScript
360 lines
10 KiB
JavaScript
/*
|
|
Copyright (c) 2004-2006, The Dojo Foundation
|
|
All Rights Reserved.
|
|
|
|
Licensed under the Academic Free License version 2.1 or above OR the
|
|
modified BSD license. For more information on Dojo licensing, see:
|
|
|
|
http://dojotoolkit.org/community/licensing.shtml
|
|
*/
|
|
|
|
if(typeof window == 'undefined'){
|
|
dojo.raise("no window object");
|
|
}
|
|
|
|
// attempt to figure out the path to dojo if it isn't set in the config
|
|
(function() {
|
|
// before we get any further with the config options, try to pick them out
|
|
// of the URL. Most of this code is from NW
|
|
if(djConfig.allowQueryConfig){
|
|
var baseUrl = document.location.toString(); // FIXME: use location.query instead?
|
|
var params = baseUrl.split("?", 2);
|
|
if(params.length > 1){
|
|
var paramStr = params[1];
|
|
var pairs = paramStr.split("&");
|
|
for(var x in pairs){
|
|
var sp = pairs[x].split("=");
|
|
// FIXME: is this eval dangerous?
|
|
if((sp[0].length > 9)&&(sp[0].substr(0, 9) == "djConfig.")){
|
|
var opt = sp[0].substr(9);
|
|
try{
|
|
djConfig[opt]=eval(sp[1]);
|
|
}catch(e){
|
|
djConfig[opt]=sp[1];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(((djConfig["baseScriptUri"] == "")||(djConfig["baseRelativePath"] == "")) &&(document && document.getElementsByTagName)){
|
|
var scripts = document.getElementsByTagName("script");
|
|
var rePkg = /(__package__|dojo|bootstrap1)\.js([\?\.]|$)/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) {
|
|
var root = src.substring(0, m.index);
|
|
if(src.indexOf("bootstrap1") > -1) { root += "../"; }
|
|
if(!this["djConfig"]) { djConfig = {}; }
|
|
if(djConfig["baseScriptUri"] == "") { djConfig["baseScriptUri"] = root; }
|
|
if(djConfig["baseRelativePath"] == "") { djConfig["baseRelativePath"] = root; }
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// fill in the rendering support information in dojo.render.*
|
|
var dr = dojo.render;
|
|
var drh = dojo.render.html;
|
|
var drs = dojo.render.svg;
|
|
var dua = drh.UA = navigator.userAgent;
|
|
var dav = drh.AV = navigator.appVersion;
|
|
var t = true;
|
|
var f = false;
|
|
drh.capable = t;
|
|
drh.support.builtin = t;
|
|
|
|
dr.ver = parseFloat(drh.AV);
|
|
dr.os.mac = dav.indexOf("Macintosh") >= 0;
|
|
dr.os.win = dav.indexOf("Windows") >= 0;
|
|
// could also be Solaris or something, but it's the same browser
|
|
dr.os.linux = dav.indexOf("X11") >= 0;
|
|
|
|
drh.opera = dua.indexOf("Opera") >= 0;
|
|
drh.khtml = (dav.indexOf("Konqueror") >= 0)||(dav.indexOf("Safari") >= 0);
|
|
drh.safari = dav.indexOf("Safari") >= 0;
|
|
var geckoPos = dua.indexOf("Gecko");
|
|
drh.mozilla = drh.moz = (geckoPos >= 0)&&(!drh.khtml);
|
|
if (drh.mozilla) {
|
|
// gecko version is YYYYMMDD
|
|
drh.geckoVersion = dua.substring(geckoPos + 6, geckoPos + 14);
|
|
}
|
|
drh.ie = (document.all)&&(!drh.opera);
|
|
drh.ie50 = drh.ie && dav.indexOf("MSIE 5.0")>=0;
|
|
drh.ie55 = drh.ie && dav.indexOf("MSIE 5.5")>=0;
|
|
drh.ie60 = drh.ie && dav.indexOf("MSIE 6.0")>=0;
|
|
drh.ie70 = drh.ie && dav.indexOf("MSIE 7.0")>=0;
|
|
|
|
// TODO: is the HTML LANG attribute relevant?
|
|
dojo.locale = (drh.ie ? navigator.userLanguage : navigator.language).toLowerCase();
|
|
|
|
dr.vml.capable=drh.ie;
|
|
drs.capable = f;
|
|
drs.support.plugin = f;
|
|
drs.support.builtin = f;
|
|
if (document.implementation
|
|
&& document.implementation.hasFeature
|
|
&& document.implementation.hasFeature("org.w3c.dom.svg", "1.0")
|
|
){
|
|
drs.capable = t;
|
|
drs.support.builtin = t;
|
|
drs.support.plugin = f;
|
|
}
|
|
})();
|
|
|
|
dojo.hostenv.startPackage("dojo.hostenv");
|
|
|
|
dojo.render.name = dojo.hostenv.name_ = 'browser';
|
|
dojo.hostenv.searchIds = [];
|
|
|
|
// These are in order of decreasing likelihood; this will change in time.
|
|
dojo.hostenv._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
|
|
|
|
dojo.hostenv.getXmlhttpObject = function(){
|
|
var http = null;
|
|
var last_e = null;
|
|
try{ http = new XMLHttpRequest(); }catch(e){}
|
|
if(!http){
|
|
for(var i=0; i<3; ++i){
|
|
var progid = dojo.hostenv._XMLHTTP_PROGIDS[i];
|
|
try{
|
|
http = new ActiveXObject(progid);
|
|
}catch(e){
|
|
last_e = e;
|
|
}
|
|
|
|
if(http){
|
|
dojo.hostenv._XMLHTTP_PROGIDS = [progid]; // so faster next time
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*if(http && !http.toString) {
|
|
http.toString = function() { "[object XMLHttpRequest]"; }
|
|
}*/
|
|
}
|
|
|
|
if(!http){
|
|
return dojo.raise("XMLHTTP not available", last_e);
|
|
}
|
|
|
|
return http;
|
|
}
|
|
|
|
/**
|
|
* Read the contents of the specified uri and return those contents.
|
|
*
|
|
* @param uri A relative or absolute uri. If absolute, it still must be in the
|
|
* same "domain" as we are.
|
|
*
|
|
* @param async_cb If not specified, load synchronously. If specified, load
|
|
* asynchronously, and use async_cb as the progress handler which takes the
|
|
* xmlhttp object as its argument. If async_cb, this function returns null.
|
|
*
|
|
* @param fail_ok Default false. If fail_ok and !async_cb and loading fails,
|
|
* return null instead of throwing.
|
|
*/
|
|
dojo.hostenv.getText = function(uri, async_cb, fail_ok){
|
|
|
|
var http = this.getXmlhttpObject();
|
|
|
|
if(async_cb){
|
|
http.onreadystatechange = function(){
|
|
if(4==http.readyState){
|
|
if((!http["status"])||((200 <= http.status)&&(300 > http.status))){
|
|
// dojo.debug("LOADED URI: "+uri);
|
|
async_cb(http.responseText);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
http.open('GET', uri, async_cb ? true : false);
|
|
try{
|
|
http.send(null);
|
|
if(async_cb){
|
|
return null;
|
|
}
|
|
if((http["status"])&&((200 > http.status)||(300 <= http.status))){
|
|
throw Error("Unable to load "+uri+" status:"+ http.status);
|
|
}
|
|
}catch(e){
|
|
if((fail_ok)&&(!async_cb)){
|
|
return null;
|
|
}else{
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
return http.responseText;
|
|
}
|
|
|
|
/*
|
|
* It turns out that if we check *right now*, as this script file is being loaded,
|
|
* then the last script element in the window DOM is ourselves.
|
|
* That is because any subsequent script elements haven't shown up in the document
|
|
* object yet.
|
|
*/
|
|
/*
|
|
function dj_last_script_src() {
|
|
var scripts = window.document.getElementsByTagName('script');
|
|
if(scripts.length < 1){
|
|
dojo.raise("No script elements in window.document, so can't figure out my script src");
|
|
}
|
|
var script = scripts[scripts.length - 1];
|
|
var src = script.src;
|
|
if(!src){
|
|
dojo.raise("Last script element (out of " + scripts.length + ") has no src");
|
|
}
|
|
return src;
|
|
}
|
|
|
|
if(!dojo.hostenv["library_script_uri_"]){
|
|
dojo.hostenv.library_script_uri_ = dj_last_script_src();
|
|
}
|
|
*/
|
|
|
|
dojo.hostenv.defaultDebugContainerId = 'dojoDebug';
|
|
dojo.hostenv._println_buffer = [];
|
|
dojo.hostenv._println_safe = false;
|
|
dojo.hostenv.println = function (line){
|
|
if(!dojo.hostenv._println_safe){
|
|
dojo.hostenv._println_buffer.push(line);
|
|
}else{
|
|
try {
|
|
var console = document.getElementById(djConfig.debugContainerId ?
|
|
djConfig.debugContainerId : dojo.hostenv.defaultDebugContainerId);
|
|
if(!console) { console = document.getElementsByTagName("body")[0] || document.body; }
|
|
|
|
var div = document.createElement("div");
|
|
div.appendChild(document.createTextNode(line));
|
|
console.appendChild(div);
|
|
} catch (e) {
|
|
try{
|
|
// safari needs the output wrapped in an element for some reason
|
|
document.write("<div>" + line + "</div>");
|
|
}catch(e2){
|
|
window.status = line;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
dojo.addOnLoad(function(){
|
|
dojo.hostenv._println_safe = true;
|
|
while(dojo.hostenv._println_buffer.length > 0){
|
|
dojo.hostenv.println(dojo.hostenv._println_buffer.shift());
|
|
}
|
|
});
|
|
|
|
function dj_addNodeEvtHdlr(node, evtName, fp, capture){
|
|
var oldHandler = node["on"+evtName] || function(){};
|
|
node["on"+evtName] = function(){
|
|
fp.apply(node, arguments);
|
|
oldHandler.apply(node, arguments);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
/* Uncomment this to allow init after DOMLoad, not after window.onload
|
|
|
|
// Mozilla exposes the event we could use
|
|
if (dojo.render.html.mozilla) {
|
|
document.addEventListener("DOMContentLoaded", dj_load_init, null);
|
|
}
|
|
// for Internet Explorer. readyState will not be achieved on init call, but dojo doesn't need it
|
|
//Tighten up the comments below to allow init after DOMLoad, not after window.onload
|
|
/ * @cc_on @ * /
|
|
/ * @if (@_win32)
|
|
document.write("<script defer>dj_load_init()<"+"/script>");
|
|
/ * @end @ * /
|
|
*/
|
|
|
|
// default for other browsers
|
|
// potential TODO: apply setTimeout approach for other browsers
|
|
// that will cause flickering though ( document is loaded and THEN is processed)
|
|
// maybe show/hide required in this case..
|
|
// TODO: other browsers may support DOMContentLoaded/defer attribute. Add them to above.
|
|
dj_addNodeEvtHdlr(window, "load", function(){
|
|
// allow multiple calls, only first one will take effect
|
|
if(arguments.callee.initialized){ return; }
|
|
arguments.callee.initialized = true;
|
|
|
|
var initFunc = function(){
|
|
//perform initialization
|
|
if(dojo.render.html.ie){
|
|
dojo.hostenv.makeWidgets();
|
|
}
|
|
};
|
|
|
|
if(dojo.hostenv.inFlightCount == 0){
|
|
initFunc();
|
|
dojo.hostenv.modulesLoaded();
|
|
}else{
|
|
dojo.addOnLoad(initFunc);
|
|
}
|
|
});
|
|
|
|
dj_addNodeEvtHdlr(window, "unload", function(){
|
|
dojo.hostenv.unloaded();
|
|
});
|
|
|
|
dojo.hostenv.makeWidgets = function(){
|
|
// you can put searchIds in djConfig and dojo.hostenv at the moment
|
|
// we should probably eventually move to one or the other
|
|
var sids = [];
|
|
if(djConfig.searchIds && djConfig.searchIds.length > 0) {
|
|
sids = sids.concat(djConfig.searchIds);
|
|
}
|
|
if(dojo.hostenv.searchIds && dojo.hostenv.searchIds.length > 0) {
|
|
sids = sids.concat(dojo.hostenv.searchIds);
|
|
}
|
|
|
|
if((djConfig.parseWidgets)||(sids.length > 0)){
|
|
if(dojo.evalObjPath("dojo.widget.Parse")){
|
|
// we must do this on a delay to avoid:
|
|
// http://www.shaftek.org/blog/archives/000212.html
|
|
// IE is such a tremendous peice of shit.
|
|
var parser = new dojo.xml.Parse();
|
|
if(sids.length > 0){
|
|
for(var x=0; x<sids.length; x++){
|
|
var tmpNode = document.getElementById(sids[x]);
|
|
if(!tmpNode){ continue; }
|
|
var frag = parser.parseElement(tmpNode, null, true);
|
|
dojo.widget.getParser().createComponents(frag);
|
|
}
|
|
}else if(djConfig.parseWidgets){
|
|
var frag = parser.parseElement(document.getElementsByTagName("body")[0] || document.body, null, true);
|
|
dojo.widget.getParser().createComponents(frag);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
dojo.addOnLoad(function(){
|
|
if(!dojo.render.html.ie) {
|
|
dojo.hostenv.makeWidgets();
|
|
}
|
|
});
|
|
|
|
try {
|
|
if (dojo.render.html.ie) {
|
|
document.write('<style>v\:*{ behavior:url(#default#VML); }</style>');
|
|
document.write('<xml:namespace ns="urn:schemas-microsoft-com:vml" prefix="v"/>');
|
|
}
|
|
} catch (e) { }
|
|
|
|
// stub, over-ridden by debugging code. This will at least keep us from
|
|
// breaking when it's not included
|
|
dojo.hostenv.writeIncludes = function(){}
|
|
|
|
dojo.byId = function(id, doc){
|
|
if(id && (typeof id == "string" || id instanceof String)){
|
|
if(!doc){ doc = document; }
|
|
return doc.getElementById(id);
|
|
}
|
|
return id; // assume it's a node
|
|
}
|