Blame | Last modification | View Log | RSS feed
if(!dojo._hasResource["dojox.layout.ContentPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojox.layout.ContentPane"] = true;dojo.provide("dojox.layout.ContentPane");dojo.require("dijit.layout.ContentPane");(function(){ // private scope, sort of a namespace// TODO: should these methods be moved to dojox.html.cssPathAdjust or something?// css at-rules must be set before any css declarations according to CSS spec// match:// @import 'http://dojotoolkit.org/dojo.css';// @import 'you/never/thought/' print;// @import url("it/would/work") tv, screen;// @import url(/did/you/now.css);// but not:// @namespace dojo "http://dojotoolkit.org/dojo.css"; /* namespace URL should always be a absolute URI */// @charset 'utf-8';// @media print{ #menuRoot {display:none;} }// we adjust all paths that dont start on '/' or contains ':'//(?![a-z]+:|\/)if(dojo.isIE){var alphaImageLoader = /(AlphaImageLoader\([^)]*?src=(['"]))(?![a-z]+:|\/)([^\r\n;}]+?)(\2[^)]*\)\s*[;}]?)/g;}var cssPaths = /(?:(?:@import\s*(['"])(?![a-z]+:|\/)([^\r\n;{]+?)\1)|url\(\s*(['"]?)(?![a-z]+:|\/)([^\r\n;]+?)\3\s*\))([a-z, \s]*[;}]?)/g;function adjustCssPaths(cssUrl, cssText){// summary:// adjusts relative paths in cssText to be relative to cssUrl// a path is considered relative if it doesn't start with '/' and not contains ':'// description:// Say we fetch a HTML page from level1/page.html// It has some inline CSS:// @import "css/page.css" tv, screen;// ...// background-image: url(images/aplhaimage.png);//// as we fetched this HTML and therefore this CSS// from level1/page.html, these paths needs to be adjusted to:// @import 'level1/css/page.css' tv, screen;// ...// background-image: url(level1/images/alphaimage.png);//// In IE it will also adjust relative paths in AlphaImageLoader()// filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/alphaimage.png');// will be adjusted to:// filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='level1/images/alphaimage.png');//// Please note that any relative paths in AlphaImageLoader in external css files wont work, as// the paths in AlphaImageLoader is MUST be declared relative to the HTML page,// not relative to the CSS file that declares itif(!cssText || !cssUrl){ return; }// support the ImageAlphaFilter if it exists, most people use it in IE 6 for transparent PNGs// We are NOT going to kill it in IE 7 just because the PNGs work there. Somebody might have// other uses for it.// If user want to disable css filter in IE6 he/she should// unset filter in a declaration that just IE 6 doesn't understands// like * > .myselector { filter:none; }if(alphaImageLoader){cssText = cssText.replace(alphaImageLoader, function(ignore, pre, delim, url, post){return pre + (new dojo._Url(cssUrl, './'+url).toString()) + post;});}return cssText.replace(cssPaths, function(ignore, delimStr, strUrl, delimUrl, urlUrl, media){if(strUrl){return '@import "' + (new dojo._Url(cssUrl, './'+strUrl).toString()) + '"' + media;}else{return 'url(' + (new dojo._Url(cssUrl, './'+urlUrl).toString()) + ')' + media;}});}// attributepaths one tag can have multiple paths, example:// <input src="..." style="url(..)"/> or <a style="url(..)" href="..">// <img style='filter:progid...AlphaImageLoader(src="noticeTheSrcHereRunsThroughHtmlSrc")' src="img">var htmlAttrPaths = /(<[a-z][a-z0-9]*\s[^>]*)(?:(href|src)=(['"]?)([^>]*?)\3|style=(['"]?)([^>]*?)\5)([^>]*>)/gi;function adjustHtmlPaths(htmlUrl, cont){var url = htmlUrl || "./";return cont.replace(htmlAttrPaths,function(tag, start, name, delim, relUrl, delim2, cssText, end){return start + (name ?(name + '=' + delim + (new dojo._Url(url, relUrl).toString()) + delim): ('style=' + delim2 + adjustCssPaths(url, cssText) + delim2)) + end;});}function secureForInnerHtml(cont){/********* remove <!DOCTYPE.. and <title>..</title> tag **********/// khtml is picky about dom faults, you can't attach a <style> or <title> node as child of body// must go into head, so we need to cut out those tagsreturn cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig, "");}function snarfStyles(/*String*/cssUrl, /*String*/cont, /*Array*/styles){/**************** cut out all <style> and <link rel="stylesheet" href=".."> **************/// also return any attributes from this tag (might be a media attribute)// if cssUrl is set it will adjust paths accordinglystyles.attributes = [];return cont.replace(/(?:<style([^>]*)>([\s\S]*?)<\/style>|<link\s+(?=[^>]*rel=['"]?stylesheet)([^>]*?href=(['"])([^>]*?)\4[^>\/]*)\/?>)/gi,function(ignore, styleAttr, cssText, linkAttr, delim, href){// trim attributevar i, attr = (styleAttr||linkAttr||"").replace(/^\s*([\s\S]*?)\s*$/i, "$1");if(cssText){i = styles.push(cssUrl ? adjustCssPaths(cssUrl, cssText) : cssText);}else{i = styles.push('@import "' + href + '";')attr = attr.replace(/\s*(?:rel|href)=(['"])?[^\s]*\1\s*/gi, ""); // remove rel=... and href=...}if(attr){attr = attr.split(/\s+/);// split on both "\n", "\t", " " etcvar atObj = {}, tmp;for(var j = 0, e = attr.length; j < e; j++){tmp = attr[j].split('=')// split name='value'atObj[tmp[0]] = tmp[1].replace(/^\s*['"]?([\s\S]*?)['"]?\s*$/, "$1"); // trim and remove ''}styles.attributes[i - 1] = atObj;}return ""; // squelsh the <style> or <link>});}function snarfScripts(cont, byRef){// summary// strips out script tags from cont// invoke with// byRef = {errBack:function(){/*add your download error code here*/, downloadRemote: true(default false)}}// byRef will have {code: 'jscode'} when this scope leavesbyRef.code = "";function download(src){if(byRef.downloadRemote){// console.debug('downloading',src);dojo.xhrGet({url: src,sync: true,load: function(code){byRef.code += code+";";},error: byRef.errBack});}}// match <script>, <script type="text/..., but not <script type="dojo(/method)...return cont.replace(/<script\s*(?![^>]*type=['"]?dojo)(?:[^>]*?(?:src=(['"]?)([^>]*?)\1[^>]*)?)*>([\s\S]*?)<\/script>/gi,function(ignore, delim, src, code){if(src){download(src);}else{byRef.code += code;}return "";});}function evalInGlobal(code, appendNode){// we do our own eval here as dojo.eval doesn't eval in global crossbrowser// This work X browser but but it relies on a DOM// plus it doesn't return anything, thats unrelevant here but not for dojo coreappendNode = appendNode || dojo.doc.body;var n = appendNode.ownerDocument.createElement('script');n.type = "text/javascript";appendNode.appendChild(n);n.text = code; // DOM 1 says this should work}/*=====dojox.layout.ContentPane.DeferredHandle = {// cancel: Functioncancel: function(){// summary: cancel a in flight download},addOnLoad: function(func){// summary: add a callback to the onLoad chain// func: Function},addOnUnload: function(func){// summary: add a callback to the onUnload chain// func: Function}}=====*/dojo.declare("dojox.layout.ContentPane", dijit.layout.ContentPane, {// summary:// An extended version of dijit.layout.ContentPane// Supports infile scrips and external ones declared by <script src=''// relative path adjustments (content fetched from a different folder)// <style> and <link rel='stylesheet' href='..'> tags,// css paths inside cssText is adjusted (if you set adjustPaths = true)//// NOTE that dojo.require in script in the fetched file isn't recommended// Many widgets need to be required at page load to work properly// adjustPaths: Boolean// Adjust relative paths in html string content to point to this page// Only usefull if you grab content from a another folder then the current oneadjustPaths: false,// cleanContent: Boolean// summary:// cleans content to make it less likly to generate DOM/JS errors.// description:// usefull if you send contentpane a complete page, instead of a html fragment// scans for// style nodes, inserts in Document head// title Node, remove// DOCTYPE tag, remove// <!-- *JS code here* -->// <![CDATA[ *JS code here* ]]>cleanContent: false,// renderStyles: Boolean// trigger/load styles in the contentrenderStyles: false,// executeScripts: Boolean// Execute (eval) scripts that is found in the contentexecuteScripts: true,// scriptHasHooks: Boolean// replace keyword '_container_' in scripts with 'dijit.byId(this.id)'// NOTE this name might change in the near futurescriptHasHooks: false,/*======// ioMethod: dojo.xhrGet|dojo.xhrPost// reference to the method that should grab the contentioMethod: dojo.xhrGet,// ioArgs: Object// makes it possible to add custom args to xhrGet, like ioArgs.headers['X-myHeader'] = 'true'ioArgs: {},// onLoadDeferred: dojo.Deferred// callbackchain will start when onLoad occursonLoadDeferred: new dojo.Deferred(),// onUnloadDeferred: dojo.Deferred// callbackchain will start when onUnload occursonUnloadDeferred: new dojo.Deferred(),setHref: function(url){// summary: replace current content with url's contentreturn ;// dojox.layout.ContentPane.DeferredHandle},refresh: function(){summary: force a re-download of contentreturn ;// dojox.layout.ContentPane.DeferredHandle},======*/constructor: function(){// init per instance properties, initializer doesn't work here because how things is hooked up in dijit._Widgetthis.ioArgs = {};this.ioMethod = dojo.xhrGet;this.onLoadDeferred = new dojo.Deferred();this.onUnloadDeferred = new dojo.Deferred();},postCreate: function(){// override to support loadDeferredthis._setUpDeferreds();dijit.layout.ContentPane.prototype.postCreate.apply(this, arguments);},onExecError: function(e){// summary// event callback, called on script error or on java handler error// overide and return your own html string if you want a some text// displayed within the ContentPane},setContent: function(data){// summary: set data as new content, sort of like innerHTML// data: String|DomNode|NodeList|dojo.NodeListif(!this._isDownloaded){var defObj = this._setUpDeferreds();}dijit.layout.ContentPane.prototype.setContent.apply(this, arguments);return defObj; // dojox.layout.ContentPane.DeferredHandle},cancel: function(){// summary: cancels a inflight downloadif(this._xhrDfd && this._xhrDfd.fired == -1){// we are still in flight, which means we should reset our DeferredHandle// otherwise we will trigger onUnLoad chain of the canceled content,// the canceled content have never gotten onLoad so it shouldn't get onUnloadthis.onUnloadDeferred = null;}dijit.layout.ContentPane.prototype.cancel.apply(this, arguments);},_setUpDeferreds: function(){var _t = this, cancel = function(){ _t.cancel(); }var onLoad = (_t.onLoadDeferred = new dojo.Deferred());var onUnload = (_t._nextUnloadDeferred = new dojo.Deferred());return {cancel: cancel,addOnLoad: function(func){onLoad.addCallback(func);},addOnUnload: function(func){onUnload.addCallback(func);}};},_onLoadHandler: function(){dijit.layout.ContentPane.prototype._onLoadHandler.apply(this, arguments);if(this.onLoadDeferred){this.onLoadDeferred.callback(true);}},_onUnloadHandler: function(){this.isLoaded = false;this.cancel();// need to cancel so we don't get any inflight suprisesif(this.onUnloadDeferred){this.onUnloadDeferred.callback(true);}dijit.layout.ContentPane.prototype._onUnloadHandler.apply(this, arguments);if(this._nextUnloadDeferred){this.onUnloadDeferred = this._nextUnloadDeferred;}},_onError: function(type, err){dijit.layout.ContentPane.prototype._onError.apply(this, arguments);if(this.onLoadDeferred){this.onLoadDeferred.errback(err);}},_prepareLoad: function(forceLoad){// sets up for a xhrLoad, load is deferred until widget is showingvar defObj = this._setUpDeferreds();dijit.layout.ContentPane.prototype._prepareLoad.apply(this, arguments);return defObj;},_setContent: function(cont){// override dijit.layout.ContentPane._setContent, to enable path adjustmentsvar styles = [];// init varsif(dojo.isString(cont)){if(this.adjustPaths && this.href){cont = adjustHtmlPaths(this.href, cont);}if(this.cleanContent){cont = secureForInnerHtml(cont);}if(this.renderStyles || this.cleanContent){cont = snarfStyles(this.href, cont, styles);}// because of a bug in IE, script tags that is first in html hierarchy doesnt make it into the DOM// when content is innerHTML'ed, so we can't use dojo.query to retrieve scripts from DOMif(this.executeScripts){var _t = this, code, byRef = {downloadRemote: true,errBack:function(e){_t._onError.call(_t, 'Exec', 'Error downloading remote script in "'+_t.id+'"', e);}};cont = snarfScripts(cont, byRef);code = byRef.code;}// rationale for this block:// if containerNode/domNode is a table derivate tag, some browsers dont allow innerHTML on thosevar node = (this.containerNode || this.domNode), pre = post = '', walk = 0;switch(name = node.nodeName.toLowerCase()){case 'tr':pre = '<tr>'; post = '</tr>';walk += 1;//fallthroughcase 'tbody': case 'thead':// children of THEAD is of same type as TBODYpre = '<tbody>' + pre; post += '</tbody>';walk += 1;// falltroughcase 'table':pre = '<table>' + pre; post += '</table>';walk += 1;break;}if(walk){var n = node.ownerDocument.createElement('div');n.innerHTML = pre + cont + post;do{n = n.firstChild;}while(--walk);cont = n.childNodes;}}// render the contentdijit.layout.ContentPane.prototype._setContent.call(this, cont);// clear old stylenodes from the DOMif(this._styleNodes && this._styleNodes.length){while(this._styleNodes.length){dojo._destroyElement(this._styleNodes.pop());}}// render new style nodesif(this.renderStyles && styles && styles.length){this._renderStyles(styles);}if(this.executeScripts && code){if(this.cleanContent){// clean JS from html comments and other crap that browser// parser takes care of in a normal page loadcode = code.replace(/(<!--|(?:\/\/)?-->|<!\[CDATA\[|\]\]>)/g, '');}if(this.scriptHasHooks){// replace _container_ with dijit.byId(this.id)code = code.replace(/_container_(?!\s*=[^=])/g, "dijit.byId('"+this.id+"')");}try{evalInGlobal(code, (this.containerNode || this.domNode));}catch(e){this._onError('Exec', 'Error eval script in '+this.id+', '+e.message, e);}}},_renderStyles: function(styles){// insert css from content into document headthis._styleNodes = [];var st, att, cssText, doc = this.domNode.ownerDocument;var head = doc.getElementsByTagName('head')[0];for(var i = 0, e = styles.length; i < e; i++){cssText = styles[i]; att = styles.attributes[i];st = doc.createElement('style');st.setAttribute("type", "text/css"); // this is required in CSS spec!for(var x in att){st.setAttribute(x, att[x])}this._styleNodes.push(st);head.appendChild(st); // must insert into DOM before setting cssTextif(st.styleSheet){ // IEst.styleSheet.cssText = cssText;}else{ // w3cst.appendChild(doc.createTextNode(cssText));}}}});})();}