myfaces-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From caga...@apache.org
Subject svn commit: r495409 [42/47] - in /myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource: ./ src/ src/animation/ src/cal/ src/charting/ src/charting/svg/ src/charting/vml/ src/collections/ src/crypto/ src/data/ src/data/...
Date Thu, 11 Jan 2007 22:36:18 GMT
Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/Wizard.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/Wizard.js?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/Wizard.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/Wizard.js Thu Jan 11 14:35:53 2007
@@ -0,0 +1,233 @@
+/*
+	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
+*/
+
+dojo.provide("dojo.widget.Wizard");
+
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.LayoutContainer");
+dojo.require("dojo.widget.ContentPane");
+dojo.require("dojo.event.*");
+dojo.require("dojo.html.style");
+
+// TODO: base this on PageContainer
+dojo.widget.defineWidget(
+	"dojo.widget.WizardContainer",
+	dojo.widget.LayoutContainer,
+{
+	// summary
+	//		A set of panels that display sequentially, typically notating a step-by-step
+	//		procedure like an install
+	
+	templatePath: dojo.uri.dojoUri("src/widget/templates/Wizard.html"),
+	templateCssPath: dojo.uri.dojoUri("src/widget/templates/Wizard.css"),
+
+	// selected: DomNode
+	//		Currently selected panel.  (Read-only)
+	selected: null,
+
+	// nextButtonLabel: String
+	//		Label for the "Next" button.
+	nextButtonLabel: "next",
+
+	// previousButtonLabel: String
+	//		Label for the "Previous" button.
+	previousButtonLabel: "previous",
+
+	// cancelButtonLabel: String
+	//		Label for the "Cancel" button.
+	cancelButtonLabel: "cancel",
+
+	// doneButtonLabel: String
+	//		Label for the "Done" button.
+	doneButtonLabel: "done",
+
+	// cancelButtonLabel: FunctionName
+	//		Name of function to call if user presses cancel button.
+	//		Cancel button is not displayed if function is not specified.
+	cancelFunction: "",
+
+	// hideDisabledButtons: Boolean
+	//		If true, disabled buttons are hidden; otherwise, they are assigned the
+	//		"WizardButtonDisabled" CSS class
+	hideDisabledButtons: false,
+
+	fillInTemplate: function(args, frag){
+		dojo.event.connect(this.nextButton, "onclick", this, "_onNextButtonClick");
+		dojo.event.connect(this.previousButton, "onclick", this, "_onPreviousButtonClick");
+		if (this.cancelFunction){
+			dojo.event.connect(this.cancelButton, "onclick", this.cancelFunction);
+		}else{
+			this.cancelButton.style.display = "none";
+		}
+		dojo.event.connect(this.doneButton, "onclick", this, "done");
+		this.nextButton.value = this.nextButtonLabel;
+		this.previousButton.value = this.previousButtonLabel;
+		this.cancelButton.value = this.cancelButtonLabel;
+		this.doneButton.value = this.doneButtonLabel;
+	},
+
+	_checkButtons: function(){
+		var lastStep = !this.hasNextPanel();
+		this.nextButton.disabled = lastStep;
+		this._setButtonClass(this.nextButton);
+		if(this.selected.doneFunction){
+			this.doneButton.style.display = "";
+			// hide the next button if this is the last one and we have a done function
+			if(lastStep){
+				this.nextButton.style.display = "none";
+			}
+		}else{
+			this.doneButton.style.display = "none";
+		}
+		this.previousButton.disabled = ((!this.hasPreviousPanel()) || (!this.selected.canGoBack));
+		this._setButtonClass(this.previousButton);
+	},
+
+	_setButtonClass: function(button){
+		if(!this.hideDisabledButtons){
+			button.style.display = "";
+			dojo.html.setClass(button, button.disabled ? "WizardButtonDisabled" : "WizardButton");
+		}else{
+			button.style.display = button.disabled ? "none" : "";
+		}
+	},
+
+	registerChild: function(panel, insertionIndex){
+		dojo.widget.WizardContainer.superclass.registerChild.call(this, panel, insertionIndex);
+		this.wizardPanelContainerNode.appendChild(panel.domNode);
+		panel.hide();
+
+		if(!this.selected){
+			this.onSelected(panel);
+		}
+		this._checkButtons();
+	},
+
+	onSelected: function(/*WizardPanel*/ panel){
+		// summary: Callback when new panel is selected..  Deselect old panel and select new one
+		if(this.selected ){
+			if (this.selected._checkPass()) {
+				this.selected.hide();
+			} else {
+				return;
+			}
+		}
+		panel.show();
+		this.selected = panel;
+	},
+
+	getPanels: function() {
+		// summary: returns array of WizardPane children
+		return this.getChildrenOfType("WizardPane", false);		// WizardPane[]
+	},
+
+	selectedIndex: function() {
+		// summary: Returns index (into this.children[]) for currently selected child.
+		if (this.selected) {
+			return dojo.lang.indexOf(this.getPanels(), this.selected);	// Integer
+		}
+		return -1;
+	},
+
+	_onNextButtonClick: function() {
+		// summary: callback when next button is clicked
+		var selectedIndex = this.selectedIndex();
+		if ( selectedIndex > -1 ) {
+			var childPanels = this.getPanels();
+			if (childPanels[selectedIndex + 1]) {
+				this.onSelected(childPanels[selectedIndex + 1]);
+			}
+		}
+		this._checkButtons();
+	},
+
+	_onPreviousButtonClick: function() {
+		// summary: callback when previous button is clicked
+		var selectedIndex = this.selectedIndex();
+		if ( selectedIndex > -1 ) {
+			var childPanels = this.getPanels();
+			if (childPanels[selectedIndex - 1]) {
+				this.onSelected(childPanels[selectedIndex - 1]);
+			}
+		}
+		this._checkButtons();
+	},
+
+	hasNextPanel: function() {
+		// summary: Returns true if there's a another panel after the current panel
+		var selectedIndex = this.selectedIndex();
+		return (selectedIndex < (this.getPanels().length - 1));
+	},
+
+	hasPreviousPanel: function() {
+		// summary: Returns true if there's a panel before the current panel
+		var selectedIndex = this.selectedIndex();
+		return (selectedIndex > 0);
+	},
+
+	done: function() {
+		// summary: Finish the wizard's operation
+		this.selected.done();
+	}
+});
+
+dojo.widget.defineWidget(
+	"dojo.widget.WizardPane",
+	dojo.widget.ContentPane,
+{
+	// summary
+	//		a panel in a WizardContainer
+
+	// canGoBack: Boolean
+	//		If true, then can move back to a previous panel (by clicking the "Previous" button)
+	canGoBack: true,
+
+	// passFunction: String
+	//		Name of function that checks if it's OK to advance to the next panel.
+	//		If it's not OK (for example, mandatory field hasn't been entered), then
+	//		returns an error message (String) explaining the reason.
+	passFunction: "",
+	
+	// doneFunction: String
+	//		Name of function that is run if you press the "Done" button from this panel
+	doneFunction: "",
+
+	postMixInProperties: function(args, frag) {
+		if (this.passFunction) {
+			this.passFunction = dj_global[this.passFunction];
+		}
+		if (this.doneFunction) {
+			this.doneFunction = dj_global[this.doneFunction];
+		}
+		dojo.widget.WizardPane.superclass.postMixInProperties.apply(this, arguments);
+	},
+
+	_checkPass: function() {
+		// summary:
+		//		Called when the user presses the "next" button.
+		//		Calls passFunction to see if it's OK to advance to next panel, and
+		//		if it isn't, then display error.
+		//		Returns true to advance, false to not advance.
+		if (this.passFunction && dojo.lang.isFunction(this.passFunction)) {
+			var failMessage = this.passFunction();
+			if (failMessage) {
+				alert(failMessage);
+				return false;
+			}
+		}
+		return true;
+	},
+
+	done: function() {
+		if (this.doneFunction && dojo.lang.isFunction(this.doneFunction)) {
+			this.doneFunction();
+		}
+	}
+});

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/YahooMap.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/YahooMap.js?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/YahooMap.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/YahooMap.js Thu Jan 11 14:35:53 2007
@@ -0,0 +1,195 @@
+/*
+	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
+*/
+
+dojo.provide("dojo.widget.YahooMap");
+dojo.require("dojo.event.*");
+dojo.require("dojo.math");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+
+(function(){
+	var yappid = djConfig["yAppId"]||djConfig["yahooAppId"]||"dojotoolkit";
+	if(!dojo.hostenv.post_load_){
+		if(yappid == "dojotoolkit"){
+			dojo.debug("please provide a unique Yahoo App ID in djConfig.yahooAppId when using the map widget");
+		}
+		var tag = "<scr"+"ipt src='http://api.maps.yahoo.com/ajaxymap?v=3.0&appid="+yappid+"'></scri"+"pt>";
+		if(!dj_global["YMap"]){
+			document.write(tag);
+		}
+	}else{
+		dojo.debug("cannot initialize map system after the page has been loaded! Please either manually include the script block provided by Yahoo in your page or require() the YahooMap widget before onload has fired");
+	}
+})();
+
+dojo.widget.defineWidget(
+	"dojo.widget.YahooMap",
+	dojo.widget.HtmlWidget,
+	function(){
+		// summary: Creates a widget that wraps the Yahoo Map API.
+		// description:
+		//		Widget wrapper for the Yahoo Map API; it allows you to easily embed a Yahoo Map
+		//		within your Dojo application.
+		// map: YMap
+		//		Reference to the Yahoo Map object.
+		// datasrc: String
+		//		Reference to an external (to the widget) source for point data.
+		// data: Object[]
+		//		Array of point information objects.
+		// width: Number
+		//		Width of the map control.
+		// height: Number
+		// 		Height of the map control
+		// controls: String[]
+		//		Array of strings that map to corresponding controls on a Yahoo Map.
+		this.map=null;
+		this.datasrc="";
+		this.data=[];
+		this.width=0;
+		this.height=0;
+		this.controls=["zoomlong","maptype","pan"];
+	},
+{
+	isContainer: false,
+	templatePath:null,
+	templateCssPath:null,
+
+	findCenter:function(/* array */aPts){
+		//	summary
+		//	Find the center lat/lng coordinate based on the passed points.
+		var start=new YGeoPoint(37,-90);
+		if(aPts.length==0) return start;
+		var minLat,maxLat, minLon, maxLon, cLat, cLon;
+		minLat=maxLat=aPts[0].Lat;
+		minLon=maxLon=aPts[0].Lon;
+		for(var i=0; i<aPts.length; i++){
+			minLat=Math.min(minLat,aPts[i].Lat);
+			maxLat=Math.max(maxLat,aPts[i].Lat);
+			minLon=Math.min(minLon,aPts[i].Lon);
+			maxLon=Math.max(maxLon,aPts[i].Lon);
+		}
+		cLat=dojo.math.round((minLat+maxLat)/2,6);
+		cLon=dojo.math.round((minLon+maxLon)/2,6);
+		return new YGeoPoint(cLat,cLon);	//	YGeoPoint
+	},
+	setControls:function(){
+		//	summary
+		//	Set the controls on the map
+		var methodmap={
+			maptype:"addTypeControl",
+			pan:"addPanControl",
+			zoomlong:"addZoomLong",
+			zoomshort:"addZoomShort"
+		}
+		var c=this.controls;
+		for(var i=0; i<c.length; i++){
+			var controlMethod=methodmap[c[i].toLowerCase()];
+			if(this.map[controlMethod]){
+				this.map[controlMethod]();
+			}
+		}
+	},
+	
+	parse:function(/* HTMLTable */table){
+		//	summary
+		//	Parses an HTML table for data to plot on the map.
+		this.data=[];
+
+		//	get the column indices
+		var h=table.getElementsByTagName("thead")[0];
+		if(!h){
+			return;
+		}
+
+		var a=[];
+		var cols=h.getElementsByTagName("td");
+		if(cols.length==0){
+			cols=h.getElementsByTagName("th");
+		}
+		for(var i=0; i<cols.length; i++){
+			var c=cols[i].innerHTML.toLowerCase();
+			if(c=="long") c="lng";
+			a.push(c);
+		}
+		
+		//	parse the data
+		var b=table.getElementsByTagName("tbody")[0];
+		if(!b){
+			return;
+		}
+		for(var i=0; i<b.childNodes.length; i++){
+			if(!(b.childNodes[i].nodeName&&b.childNodes[i].nodeName.toLowerCase()=="tr")){
+				continue;
+			}
+			var cells=b.childNodes[i].getElementsByTagName("td");
+			var o={};
+			for(var j=0; j<a.length; j++){
+				var col=a[j];
+				if(col=="lat"||col=="lng"){
+					o[col]=parseFloat(cells[j].innerHTML);					
+				}else{
+					o[col]=cells[j].innerHTML;
+				}
+			}
+			this.data.push(o);
+		}
+	},
+	render:function(){
+		//	summary
+		//	Plots all points in internal data array on the map.
+		var pts=[];
+		var d=this.data;
+		for(var i=0; i<d.length; i++){
+			var pt=new YGeoPoint(d[i].lat, d[i].lng);
+			pts.push(pt);
+			var icon=d[i].icon||null;
+			if(icon){
+				icon=new YImage(icon);
+			}
+			var m=new YMarker(pt,icon);
+			if(d[i].description){
+				m.addAutoExpand("<div>"+d[i].description+"</div>");
+			}
+			this.map.addOverlay(m);
+		}
+		var c=this.findCenter(pts);
+		var z=this.map.getZoomLevel(pts);
+		this.map.drawZoomAndCenter(c,z);
+	},
+	
+	initialize:function(/* object */args, /* object */frag){
+		//	summary
+		//	Initialize the widget.
+		if(!YMap || !YGeoPoint){
+			dojo.raise("dojo.widget.YahooMap: The Yahoo Map script must be included in order to use this widget.");
+		}
+		if(this.datasrc){
+			this.parse(dojo.byId(this.datasrc));
+		}
+		else if(this.domNode.getElementsByTagName("table")[0]){
+			this.parse(this.domNode.getElementsByTagName("table")[0]);
+		}
+	},
+	postCreate:function(){
+		//	summary
+		//	Finalize and plot all points on the widget.
+		while(this.domNode.childNodes.length>0){
+			this.domNode.removeChild(this.domNode.childNodes[0]);
+		}
+
+		if(this.width>0&&this.height>0){
+			this.map=new YMap(this.domNode, YAHOO_MAP_REG, new YSize(this.width, this.height));
+		}else{
+			this.map=new YMap(this.domNode);
+		}
+		this.setControls();
+		this.render();
+	}
+});

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/__package__.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/__package__.js?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/__package__.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/__package__.js Thu Jan 11 14:35:53 2007
@@ -0,0 +1,23 @@
+/*
+	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
+*/
+
+dojo.kwCompoundRequire({
+	common: ["dojo.xml.Parse", 
+			 "dojo.widget.Widget", 
+			 "dojo.widget.Parse", 
+			 "dojo.widget.Manager"],
+	browser: ["dojo.widget.DomWidget",
+			  "dojo.widget.HtmlWidget"],
+	dashboard: ["dojo.widget.DomWidget",
+			  "dojo.widget.HtmlWidget"],
+	svg: 	 ["dojo.widget.SvgWidget"],
+	rhino: 	 ["dojo.widget.SwtWidget"]
+});
+dojo.provide("dojo.widget.*");

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoContainer.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoContainer.js?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoContainer.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoContainer.js Thu Jan 11 14:35:53 2007
@@ -0,0 +1,107 @@
+/*
+	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
+*/
+
+dojo.provide("dojo.widget.demoEngine.DemoContainer");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+dojo.require("dojo.widget.demoEngine.DemoPane");
+dojo.require("dojo.widget.demoEngine.SourcePane");
+dojo.require("dojo.widget.TabContainer");
+
+dojo.widget.defineWidget("my.widget.demoEngine.DemoContainer", 
+	dojo.widget.HtmlWidget, 
+	{
+		templatePath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoContainer.html"),
+		templateCssPath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoContainer.css"),
+		postCreate: function() {
+			dojo.html.addClass(this.domNode,this.domNodeClass);
+			dojo.html.addClass(this.tabNode, this.tabClass);
+			dojo.html.addClass(this.returnImageNode, this.returnClass);
+			this.returnImageNode.src=this.returnImage;
+
+			this.tabContainer = dojo.widget.createWidget("TabContainer",{},this.tabNode);
+
+			this.demoTab = dojo.widget.createWidget("DemoPane",{});
+			this.tabContainer.addChild(this.demoTab);
+
+			this.sourceTab= dojo.widget.createWidget("SourcePane",{});
+			this.tabContainer.addChild(this.sourceTab);
+
+			dojo.html.setOpacity(this.domNode,0);
+			dojo.html.hide(this.domNode);
+		},
+
+		loadDemo: function(url) {
+			this.demoTab.setHref(url);
+			this.sourceTab.setHref(url);
+			this.showDemo();
+		},
+
+		setName: function(name) {
+			dojo.html.removeChildren(this.demoNameNode);
+			this.demoNameNode.appendChild(document.createTextNode(name));
+		},
+
+		setSummary: function(summary) {
+			dojo.html.removeChildren(this.summaryNode);
+			this.summaryNode.appendChild(document.createTextNode(summary));
+		},
+
+		showSource: function() {
+			dojo.html.removeClass(this.demoButtonNode,this.selectedButtonClass);
+			dojo.html.addClass(this.sourceButtonNode,this.selectedButtonClass);
+			this.tabContainer.selectTab(this.sourceTab);	
+		},
+
+		showDemo: function() {
+			dojo.html.removeClass(this.sourceButtonNode,this.selectedButtonClass);
+			dojo.html.addClass(this.demoButtonNode,this.selectedButtonClass);
+			this.tabContainer.selectTab(this.demoTab);
+		},
+
+		returnToDemos: function() {
+			dojo.debug("Return To Demos");
+		},
+
+		show: function() {
+			dojo.html.setOpacity(this.domNode,1);
+			dojo.html.show(this.domNode);
+			this.tabContainer.checkSize();
+		}
+	},
+	"",
+	function() {
+		dojo.debug("DemoPane Init");
+		this.domNodeClass="demoContainer";
+
+		this.tabContainer="";
+		this.sourceTab="";
+		this.demoTab="";
+
+		this.headerNode="";
+		this.returnNode="";
+	
+		this.returnImageNode="";
+		this.returnImage="images/dojoDemos.gif";
+		this.returnClass="return";
+		
+		this.summaryNode="";
+		this.demoNameNode="";
+		this.tabControlNode="";
+
+		this.tabNode="";
+		this.tabClass = "demoContainerTabs";
+
+		this.sourceButtonNode="";
+		this.demoButtonNode="";
+
+		this.selectedButtonClass="selected";
+	}
+);

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoItem.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoItem.js?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoItem.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoItem.js Thu Jan 11 14:35:53 2007
@@ -0,0 +1,71 @@
+/*
+	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
+*/
+
+dojo.provide("dojo.widget.demoEngine.DemoItem");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+
+dojo.widget.defineWidget("my.widget.demoEngine.DemoItem", 
+	dojo.widget.HtmlWidget, 
+	{
+		templatePath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoItem.html"),
+		templateCssPath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoItem.css"),
+		postCreate: function() {
+			dojo.html.addClass(this.domNode,this.domNodeClass);
+			dojo.html.addClass(this.summaryBoxNode, this.summaryBoxClass);
+			dojo.html.addClass(this.screenshotTdNode, this.screenshotTdClass);
+			dojo.html.addClass(this.summaryContainerNode, this.summaryContainerClass);
+			dojo.html.addClass(this.summaryNode, this.summaryClass);
+			dojo.html.addClass(this.viewDemoLinkNode, this.viewDemoLinkClass);
+
+			this.nameNode.appendChild(document.createTextNode(this.name));
+			this.descriptionNode.appendChild(document.createTextNode(this.description));
+			this.thumbnailImageNode.src = this.thumbnail;
+			this.thumbnailImageNode.name=this.name;
+			this.viewDemoImageNode.src = this.viewDemoImage;
+			this.viewDemoImageNode.name=this.name;
+		},
+		onSelectDemo: function() {
+			//Attach to this to do something when a demo is selected
+		}
+	},
+	"",
+	function() {
+		this.demo = "";
+
+		this.domNodeClass="demoItemWrapper";
+
+		this.summaryBoxNode="";
+		this.summaryBoxClass="demoItemSummaryBox";
+
+		this.nameNode="";
+		this.thumbnailImageNode="";
+		this.viewDemoImageNode="";
+
+		this.screenshotTdNode="";
+		this.screenshotTdClass="demoItemScreenshot";
+
+		this.summaryContainerNode="";
+		this.summaryContainerClass="demoItemSummaryContainer";
+
+		this.summaryNode="";
+		this.summaryClass="demoItemSummary";
+
+		this.viewDemoLinkNode="";
+		this.viewDemoLinkClass="demoItemView";
+
+		this.descriptionNode="";
+
+		this.name="Some Demo";
+		this.description="This is the description of this demo.";
+		this.thumbnail="images/test_thumb.gif";
+		this.viewDemoImage="images/viewDemo.png";
+	}
+);

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoNavigator.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoNavigator.js?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoNavigator.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoNavigator.js Thu Jan 11 14:35:53 2007
@@ -0,0 +1,188 @@
+/*
+	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
+*/
+
+dojo.provide("dojo.widget.demoEngine.DemoNavigator");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+dojo.require("dojo.widget.Button");
+dojo.require("dojo.widget.demoEngine.DemoItem");
+dojo.require("dojo.io.*");
+dojo.require("dojo.lfx.*");
+dojo.require("dojo.lang.common");
+
+dojo.widget.defineWidget("my.widget.demoEngine.DemoNavigator", 
+	dojo.widget.HtmlWidget, 
+	{
+		templatePath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoNavigator.html"),
+		templateCssPath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoNavigator.css"),
+		postCreate: function() {
+			dojo.html.addClass(this.domNode,this.domNodeClass);
+			dojo.html.addClass(this.demoListWrapperNode,this.demoListWrapperClass);
+			dojo.html.addClass(this.demoListContainerNode,this.demoListContainerClass);
+
+			if (dojo.render.html.ie) {
+				dojo.debug("render ie");
+				dojo.html.hide(this.demoListWrapperNode); 
+			} else {
+				dojo.debug("render non-ie");
+				dojo.lfx.html.fadeHide(this.demoListWrapperNode, 0).play();	
+			}
+
+			this.getRegistry(this.demoRegistryUrl);
+
+			this.demoContainer = dojo.widget.createWidget("DemoContainer",{returnImage: this.returnImage},this.demoNode);
+			dojo.event.connect(this.demoContainer,"returnToDemos", this, "returnToDemos");
+			this.demoContainer.hide();
+		},
+
+		returnToDemos: function() {
+			this.demoContainer.hide();
+			if (dojo.render.html.ie) {
+				dojo.debug("render ie");
+				dojo.html.show(this.navigationContainer) ;
+			} else {	
+				dojo.debug("render non-ie");
+				dojo.lfx.html.fadeShow(this.navigationContainer,250).play();
+			}
+
+			//if (dojo.render.html.ie) {
+			//	dojo.html.setOpacity(this.navigationContainer);
+			//}
+
+			dojo.lang.forEach(this.categoriesChildren, dojo.lang.hitch(this, function(child){
+				child.checkSize();
+			}));
+
+			dojo.lang.forEach(this.demoListChildren, dojo.lang.hitch(this, function(child){
+				child.checkSize();
+			}));
+		},
+
+		show: function() {
+			//dojo.widget.demoEngine.DemoNavigator.superclass.show.call(this);
+			dojo.html.show(this.domNode);
+			dojo.html.setOpacity(this.domNode,1);
+			//dojo.html.setOpacity(this.navigationContainer);	
+			//dojo.html.show(this.navigationContainer);
+			dojo.html.setOpacity(this.navigationContainer,1);
+
+			dojo.lang.forEach(this.categoriesChildren, dojo.lang.hitch(this, function(child){
+				child.checkSize();
+			}));
+
+			dojo.lang.forEach(this.demoListChildren, dojo.lang.hitch(this, function(child){
+				child.checkSize();
+			}));
+		},
+		getRegistry: function(url) {
+			dojo.io.bind({
+				url: url,
+				load: dojo.lang.hitch(this,this.processRegistry),
+				mimetype: "text/json"
+			});
+		},
+
+		processRegistry: function(type,registry,e) {
+			dojo.debug("Processing Registry");
+			this.registry = registry;
+			dojo.lang.forEach(this.registry.navigation, dojo.lang.hitch(this,this.addCategory)); 
+		},
+
+		addCategory: function(category) {
+				var newCat = dojo.widget.createWidget("Button",{caption: category.name});
+
+				if(!dojo.lang.isObject(this.registry.categories)) {
+					this.registry.categories=function(){};
+				}
+
+				this.registry.categories[category.name] = category;
+				this.categoriesChildren.push(newCat);
+				this.categoriesButtonsNode.appendChild(newCat.domNode);	
+				newCat.domNode.categoryName = category.name;
+				dojo.event.connect(newCat,"onClick", this, "onSelectCategory");
+		},
+
+		addDemo: function(demoName) {
+			var demo = this.registry.definitions[demoName];
+
+			if (dojo.render.html.ie) {
+				dojo.html.show(this.demoListWrapperNode) 
+			} else {
+				dojo.lfx.html.fadeShow(this.demoListWrapperNode, 250).play();
+			}
+
+			var newDemo = dojo.widget.createWidget("DemoItem",{viewDemoImage: this.viewDemoImage, name: demoName, description: demo.description, thumbnail: demo.thumbnail});
+			this.demoListChildren.push(newDemo);
+			this.demoListContainerNode.appendChild(newDemo.domNode);	
+			dojo.event.connect(newDemo,"onSelectDemo",this,"onSelectDemo");
+		},
+
+		onSelectCategory: function(e) {
+			catName = e.currentTarget.categoryName;	
+			dojo.debug("Selected Category: " + catName);
+			//Remove current list of demos
+			dojo.lang.forEach(this.demoListChildren, function(child) {
+					child.destroy();
+			});
+			this.demoListChildren=[];
+
+			//add demos from this cat
+			dojo.lang.forEach(this.registry.categories[catName].demos, dojo.lang.hitch(this,function(demoName){
+				this.addDemo(demoName);
+			}));
+		},
+
+		onSelectDemo: function(e) {
+			//Attach to this to do something when a demo is selected
+			dojo.debug("Demo Selected: " + e.target.name);
+
+			if (dojo.render.html.ie) {
+				dojo.debug("render ie");
+				dojo.html.hide(this.navigationContainer) ;
+				this.demoContainer.show();
+				this.demoContainer.showDemo();
+			} else {
+				dojo.debug("render non-ie");
+				dojo.lfx.html.fadeHide(this.navigationContainer,250,null,dojo.lang.hitch(this, function() {
+					this.demoContainer.show();	
+					this.demoContainer.showDemo();
+				})).play();
+			}
+
+			this.demoContainer.loadDemo(this.registry.definitions[e.target.name].url);
+			this.demoContainer.setName(e.target.name);
+			this.demoContainer.setSummary(this.registry.definitions[e.target.name].description);
+		}
+		
+	},
+	"",
+	function() {
+		this.demoRegistryUrl="demoRegistry.json";
+		this.registry=function(){};
+
+		this.categoriesNode="";
+		this.categoriesButtonsNode="";
+		this.navigationContainer="";
+
+		this.domNodeClass="demoNavigator";
+
+		this.demoNode="";
+		this.demoContainer="";
+
+		this.demoListWrapperNode="";
+		this.demoListWrapperClass="demoNavigatorListWrapper";
+		this.demoListContainerClass="demoNavigatorListContainer";
+
+		this.returnImage="images/dojoDemos.gif";
+		this.viewDemoImage="images/viewDemo.png";
+		this.demoListChildren = [];
+		this.categoriesChildren = [];
+	}
+);

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoPane.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoPane.js?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoPane.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/DemoPane.js Thu Jan 11 14:35:53 2007
@@ -0,0 +1,44 @@
+/*
+	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
+*/
+
+dojo.provide("dojo.widget.demoEngine.DemoPane");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+
+dojo.widget.defineWidget("my.widget.demoEngine.DemoPane", 
+	dojo.widget.HtmlWidget, 
+	{
+		templatePath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoPane.html"),
+		templateCssPath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoPane.css"),
+		postCreate: function() {
+			dojo.html.addClass(this.domNode,this.domNodeClass);
+			dojo.debug("PostCreate");
+			this._launchDemo();
+		},
+		
+		_launchDemo: function() {
+			dojo.debug("Launching Demo");
+			dojo.debug(this.demoNode);
+			this.demoNode.src=this.href;
+		},
+
+		setHref: function(url) {
+			this.href = url;
+			this._launchDemo();
+		}
+	},
+	"",
+	function() {
+		dojo.debug("DemoPane Init");
+		this.domNodeClass="demoPane";
+		this.demoNode = "";
+		this.href = "";
+	}
+);

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/SourcePane.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/SourcePane.js?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/SourcePane.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/SourcePane.js Thu Jan 11 14:35:53 2007
@@ -0,0 +1,52 @@
+/*
+	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
+*/
+
+dojo.provide("dojo.widget.demoEngine.SourcePane");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+dojo.require("dojo.io.*");
+
+dojo.widget.defineWidget("my.widget.demoEngine.SourcePane", 
+	dojo.widget.HtmlWidget, 
+	{
+		templatePath: dojo.uri.dojoUri("src/widget/demoEngine/templates/SourcePane.html"),
+		templateCssPath: dojo.uri.dojoUri("src/widget/demoEngine/templates/SourcePane.css"),
+		postCreate: function() {
+			dojo.html.addClass(this.domNode,this.domNodeClass);
+			dojo.debug("PostCreate");
+		},
+	
+		getSource: function() {
+			if (this.href) {
+				dojo.io.bind({
+					url: this.href,
+					load: dojo.lang.hitch(this, "fillInSource"),
+					mimetype: "text/plain"
+				});
+			}
+		},	
+
+		fillInSource: function(type, source, e) {
+			this.sourceNode.value=source;
+		},
+
+		setHref: function(url) {
+			this.href = url;
+			this.getSource();
+		}
+	},
+	"",
+	function() {
+		dojo.debug("SourcePane Init");
+		this.domNodeClass="sourcePane";
+		this.sourceNode = "";
+		this.href = "";
+	}
+);

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/__package__.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/__package__.js?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/__package__.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/__package__.js Thu Jan 11 14:35:53 2007
@@ -0,0 +1,20 @@
+/*
+	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
+*/
+
+dojo.kwCompoundRequire({
+	browser: [
+		"dojo.widget.demoEngine.DemoItem",
+		"dojo.widget.demoEngine.DemoNavigator",
+		"dojo.widget.demoEngine.DemoPane",
+		"dojo.widget.demoEngine.SourcePane",
+		"dojo.widget.demoEngine.DemoContainer"
+	]
+});
+dojo.provide("dojo.widget.demoEngine.*");

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoContainer.css
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoContainer.css?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoContainer.css (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoContainer.css Thu Jan 11 14:35:53 2007
@@ -0,0 +1,39 @@
+.demoContainer{
+	width: 100%;
+	height: 100%;
+	padding: 0px;
+	margin: 0px;
+}
+
+.demoContainer .return {
+	cursor: pointer;
+}
+
+.demoContainer span {
+	margin-right: 10px;
+	cursor: pointer;
+}
+
+.demoContainer .selected {
+	border-bottom: 5px solid #95bfff;
+}
+
+.demoContainer table {
+	background: #f5f5f5;
+	width: 100%;
+	height: 100%;
+}
+
+.demoContainerTabs {
+	width: 100%;
+	height: 400px;
+}
+
+.demoContainerTabs .dojoTabLabels-top {
+	display: none;
+}
+
+.demoContainerTabs .dojoTabPaneWrapper {
+	border: 0px;
+}
+

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoContainer.html
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoContainer.html?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoContainer.html (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoContainer.html Thu Jan 11 14:35:53 2007
@@ -0,0 +1,25 @@
+<div dojoAttachPoint="domNode">
+	<table width="100%" cellspacing="0" cellpadding="5">
+		<tbody>
+			<tr dojoAttachPoint="headerNode">
+				<td dojoAttachPoint="returnNode" valign="middle" width="1%">
+					<img dojoAttachPoint="returnImageNode" dojoAttachEvent="onclick: returnToDemos"/>
+				</td>
+				<td>
+					<h1 dojoAttachPoint="demoNameNode"></h1>
+					<p dojoAttachPoint="summaryNode"></p>
+				</td>
+				<td dojoAttachPoint="tabControlNode" valign="middle" align="right" nowrap>
+					<span dojoAttachPoint="sourceButtonNode" dojoAttachEvent="onclick: showSource">source</span>
+					<span dojoAttachPoint="demoButtonNode" dojoAttachEvent="onclick: showDemo">demo</span>
+				</td>
+			</tr>
+			<tr>
+				<td colspan="3">
+					<div dojoAttachPoint="tabNode">
+					</div>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+</div>

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoItem.css
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoItem.css?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoItem.css (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoItem.css Thu Jan 11 14:35:53 2007
@@ -0,0 +1,58 @@
+.demoItemSummaryBox {
+	background: #efefef;
+	border:1px solid #dae3ee;
+}
+
+.demoItemScreenshot {
+	padding:0.65em;
+	width:175px;
+	border-right:1px solid #fafafa;
+	text-align:center;
+	cursor: pointer;
+}
+
+.demoItemWrapper{
+	margin-bottom:1em;
+}
+
+.demoItemWrapper a:link, .demoItemWrapper a:visited {
+	color:#a6238f;
+	text-decoration:none;
+}
+
+.demoItemSummaryContainer {
+	border-left:1px solid #ddd;
+}
+
+.demoItemSummaryContainer h1 {
+	background-color:#e8e8e8;
+	border-bottom: 1px solid #e6e6e6;
+	color:#738fb9;
+	margin:1px;
+	padding:0.5em;
+	font-family:"Lucida Grande", "Tahoma", serif;
+	font-size:1.25em;
+	font-weight:normal;
+}
+
+.demoItemSummaryContainer h1 .packageSummary {
+	display:block;
+	color:#000;
+	font-size:10px;
+	margin-top:2px;
+}
+
+.demoItemSummaryContainer .demoItemSummary{
+	padding:1em;
+}
+
+.demoItemSummaryContainer .demoItemSummary p {
+	font-size:0.85em;
+	padding:0;
+	margin:0;
+}
+
+.demoItemView {
+	text-align:right;
+	cursor: pointer;
+}

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoItem.html
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoItem.html?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoItem.html (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoItem.html Thu Jan 11 14:35:53 2007
@@ -0,0 +1,21 @@
+<div dojoAttachPoint="domNode">
+	<div dojoAttachPoint="summaryBoxNode">
+		<table width="100%" cellspacing="0" cellpadding="0">
+			<tbody>
+				<tr>
+					<td dojoAttachPoint="screenshotTdNode" valign="top" width="1%">
+						<img dojoAttachPoint="thumbnailImageNode" dojoAttachEvent="onclick: onSelectDemo" />
+					</td>
+					<td dojoAttachPoint="summaryContainerNode" valign="top">
+						<h1 dojoAttachPoint="nameNode">
+						</h1>
+						<div dojoAttachPoint="summaryNode">
+							<p dojoAttachPoint="descriptionNode"></p>
+							<div dojoAttachPoint="viewDemoLinkNode"><img dojoAttachPoint="viewDemoImageNode"/ dojoAttachEvent="onclick: onSelectDemo"></div>
+						</div>
+					</td>
+				</tr>
+			</tbody>
+		</table>
+	</div>
+</div>

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoNavigator.css
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoNavigator.css?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoNavigator.css (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoNavigator.css Thu Jan 11 14:35:53 2007
@@ -0,0 +1,28 @@
+.demoNavigatorListWrapper {
+	border:1px solid #dcdbdb;
+	background-color:#f8f8f8;
+	padding:2px;
+}
+
+.demoNavigatorListContainer {
+	border:1px solid #f0f0f0;
+	background-color:#fff;
+	padding:1em;
+}
+
+.demoNavigator h1 {
+	margin-top: 0px;
+	margin-bottom: 10px;
+	font-size: 1.2em;
+	border-bottom:1px dotted #a9ccf5;
+}
+
+.demoNavigator .dojoButton {
+	margin-bottom: 5px;
+}
+
+.demoNavigator .dojoButton .dojoButtonContents {
+	font-size: 1.1em;
+	width: 100px;
+	color: black;
+}

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoNavigator.html
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoNavigator.html?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoNavigator.html (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoNavigator.html Thu Jan 11 14:35:53 2007
@@ -0,0 +1,24 @@
+<div dojoAttachPoint="domNode">
+	<table width="100%" cellspacing="0" cellpadding="5">
+		<tbody>
+			<tr dojoAttachPoint="navigationContainer">
+				<td dojoAttachPoint="categoriesNode" valign="top" width="1%">
+					<h1>Categories</h1>
+					<div dojoAttachPoint="categoriesButtonsNode"></div>
+				</td>
+
+				<td dojoAttachPoint="demoListNode" valign="top">
+					<div dojoAttachPoint="demoListWrapperNode">
+						<div dojoAttachPoint="demoListContainerNode">
+						</div>
+					</div>
+				</td>
+			</tr>
+			<tr>
+				<td colspan="2">
+					<div dojoAttachPoint="demoNode"></div>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+</div>

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoPane.css
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoPane.css?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoPane.css (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoPane.css Thu Jan 11 14:35:53 2007
@@ -0,0 +1,18 @@
+.demoPane {
+	width: 100%;
+	height: 100%;
+	padding: 0px;
+	margin: 0px;
+	overflow: hidden;
+}
+
+.demoPane iframe {
+	width: 100%;
+	height: 100%;
+	border: 0px;
+	border: none;
+	overflow: auto;
+	padding: 0px;
+	margin:0px;
+	background: #ffffff;
+}

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoPane.html
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoPane.html?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoPane.html (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/DemoPane.html Thu Jan 11 14:35:53 2007
@@ -0,0 +1,3 @@
+<div dojoAttachPoint="domNode">
+	<iframe dojoAttachPoint="demoNode"></iframe>
+</div>

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/SourcePane.css
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/SourcePane.css?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/SourcePane.css (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/SourcePane.css Thu Jan 11 14:35:53 2007
@@ -0,0 +1,20 @@
+.sourcePane {
+	width: 100%;
+	height: 100%;
+	padding: 0px;
+	margin: 0px;
+	overflow: hidden;
+}
+
+.sourcePane textarea{
+	width: 100%;
+	height: 100%;
+	border: 0px;
+	overflow: auto;
+	padding: 0px;
+	margin:0px;
+}
+
+* html .sourcePane {
+	overflow: auto;
+}

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/SourcePane.html
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/SourcePane.html?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/SourcePane.html (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/SourcePane.html Thu Jan 11 14:35:53 2007
@@ -0,0 +1,3 @@
+<div dojoAttachPoint="domNode">
+	<textarea dojoAttachPoint="sourceNode" rows="100%"></textarea>
+</div>

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/general.css
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/general.css?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/general.css (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/general.css Thu Jan 11 14:35:53 2007
@@ -0,0 +1,73 @@
+.demoListWrapper {
+	border:1px solid #dcdbdb;
+	background-color:#f8f8f8;
+	padding:2px;
+}
+
+.demoListContainer {
+	border:1px solid #f0f0f0;
+	background-color:#fff;
+	padding:1em;
+}
+
+.demoSummaryBox {
+	background: #efefef;
+	border:1px solid #dae3ee;
+}
+
+.screenshot {
+	padding:0.65em;
+	width:175px;
+	border-right:1px solid #fafafa;
+	text-align:center;
+}
+
+.demoSummary {
+	margin-bottom:1em;
+}
+
+.demoSummary a:link, .demoSummary a:visited {
+	color:#a6238f;
+	text-decoration:none;
+}
+
+.summaryContainer {
+	border-left:1px solid #ddd;
+}
+
+.summaryContainer h1 {
+	background-color:#e8e8e8;
+	border-bottom: 1px solid #e6e6e6;
+	color:#738fb9;
+	margin:1px;
+	padding:0.5em;
+	font-family:"Lucida Grande", "Tahoma", serif;
+	font-size:1.25em;
+	font-weight:normal;
+}
+
+.summaryContainer h1 .packageSummary {
+	display:block;
+	color:#000;
+	font-size:10px;
+	margin-top:2px;
+}
+
+.summaryContainer .summary {
+	padding:1em;
+}
+
+.summaryContainer .summary p {
+	font-size:0.85em;
+	padding:0;
+	margin:0;
+}
+
+.reflection {
+	background: url("images/demoBoxReflection.gif") repeat-x top left;
+	height:25px;
+}
+
+.view {
+	text-align:right;
+}

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/images/test_thumb.gif
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/images/test_thumb.gif?view=auto&rev=495409
==============================================================================
Binary file - no diff available.

Propchange: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/images/test_thumb.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/images/viewDemo.png
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/images/viewDemo.png?view=auto&rev=495409
==============================================================================
Binary file - no diff available.

Propchange: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/demoEngine/templates/images/viewDemo.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/html/layout.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/html/layout.js?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/html/layout.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/html/layout.js Thu Jan 11 14:35:53 2007
@@ -0,0 +1,133 @@
+/*
+	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
+*/
+
+dojo.provide("dojo.widget.html.layout");
+
+dojo.require("dojo.lang.common");
+dojo.require("dojo.string.extras");
+dojo.require("dojo.html.style");
+dojo.require("dojo.html.layout");
+
+dojo.widget.html.layout = function(/*DomNode*/ container, /*Object[]*/ children, /*String*/ layoutPriority) {
+	/**
+	 * summary
+	 *		Layout a bunch of child dom nodes within a parent dom node
+	 * container:
+	 *		parent node
+	 * layoutPriority:
+	 *		"top-bottom" or "left-right"
+	 * children:
+	 *		an array like [ {domNode: foo, layoutAlign: "bottom" }, {domNode: bar, layoutAlign: "client"} ]
+	 */
+
+	dojo.html.addClass(container, "dojoLayoutContainer");
+
+	// Copy children array and remove elements w/out layout.
+	// Also record each child's position in the input array, for sorting purposes.
+	children = dojo.lang.filter(children, function(child, idx){
+		child.idx = idx;
+		return dojo.lang.inArray(["top","bottom","left","right","client","flood"], child.layoutAlign)
+	});
+
+	// Order the children according to layoutPriority.
+	// Multiple children w/the same layoutPriority will be sorted by their position in the input array.
+	if(layoutPriority && layoutPriority!="none"){
+		var rank = function(child){
+			switch(child.layoutAlign){
+				case "flood":
+					return 1;
+				case "left":
+				case "right":
+					return (layoutPriority=="left-right") ? 2 : 3;
+				case "top":
+				case "bottom":
+					return (layoutPriority=="left-right") ? 3 : 2;
+				default:
+					return 4;
+			}
+		};
+		children.sort(function(a,b){
+			return (rank(a)-rank(b)) || (a.idx - b.idx);
+		});
+	}
+
+	// remaining space (blank area where nothing has been written)
+	var f={
+		top: dojo.html.getPixelValue(container, "padding-top", true),
+		left: dojo.html.getPixelValue(container, "padding-left", true)
+	};
+	dojo.lang.mixin(f, dojo.html.getContentBox(container));
+
+	// set positions/sizes
+	dojo.lang.forEach(children, function(child){
+		var elm=child.domNode;
+		var pos=child.layoutAlign;
+		// set elem to upper left corner of unused space; may move it later
+		with(elm.style){
+			left = f.left+"px";
+			top = f.top+"px";
+			bottom = "auto";
+			right = "auto";
+		}
+		dojo.html.addClass(elm, "dojoAlign" + dojo.string.capitalize(pos));
+
+		// set size && adjust record of remaining space.
+		// note that setting the width of a <div> may affect it's height.
+		// TODO: same is true for widgets but need to implement API to support that
+		if ( (pos=="top")||(pos=="bottom") ) {
+			dojo.html.setMarginBox(elm, { width: f.width });
+			var h = dojo.html.getMarginBox(elm).height;
+			f.height -= h;
+			if(pos=="top"){
+				f.top += h;
+			}else{
+				elm.style.top = f.top + f.height + "px";
+			}
+			// TODO: for widgets I want to call resizeTo(), but I can't because
+			// I only want to set the width, and have the height determined
+			// dynamically.  (The thinner you make a div, the more height it consumes.)
+			if(child.onResized){
+				child.onResized();
+			}
+		}else if(pos=="left" || pos=="right"){
+			var w = dojo.html.getMarginBox(elm).width;
+
+			// TODO: I only want to set the height, not the width, but see bug#941 (FF),
+			// and also the resizeTo() function demands both height and width arguments
+			if(child.resizeTo){
+				child.resizeTo(w, f.height);
+			}else{
+				dojo.html.setMarginBox(elm, { width: w, height: f.height });
+			}	
+
+			f.width -= w;
+			if(pos=="left"){
+				f.left += w;
+			}else{
+				elm.style.left = f.left + f.width + "px";
+			}
+		} else if(pos=="flood" || pos=="client"){
+			if(child.resizeTo){
+				child.resizeTo(f.width, f.height);
+			}else{
+				dojo.html.setMarginBox(elm, { width: f.width, height: f.height });
+			}
+		}
+	});
+};
+
+// This is essential CSS to make layout work (it isn't "styling" CSS)
+// make sure that the position:absolute in dojoAlign* overrides other classes
+dojo.html.insertCssText(
+	".dojoLayoutContainer{ position: relative; display: block; overflow: hidden; }\n" +
+	"body .dojoAlignTop, body .dojoAlignBottom, body .dojoAlignLeft, body .dojoAlignRight { position: absolute; overflow: hidden; }\n" +
+	"body .dojoAlignClient { position: absolute }\n" +
+	".dojoAlignClient { overflow: auto; }\n"
+);

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/html/loader.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/html/loader.js?view=auto&rev=495409
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/html/loader.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/html/loader.js Thu Jan 11 14:35:53 2007
@@ -0,0 +1,844 @@
+/*
+	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
+*/
+
+dojo.provide("dojo.widget.html.loader");
+
+dojo.require("dojo.widget.HtmlWidget");
+dojo.require("dojo.io.*");
+dojo.require("dojo.lang.common");
+dojo.require("dojo.lang.extras");
+
+dojo.require("dojo.experimental");
+dojo.experimental("dojo.widget.html.loader");
+
+// as this is a singleton dojo.declare doesn't buy us anything here
+dojo.widget.html.loader = new (function(){
+	// summary:
+	// 	loading stuff moved out of contentpane to make it directly accessible by other widgets
+	this.toString = function(){ return "dojo.widget.html.loader"; }
+	var _loader = this;
+
+	// back/forward tracking
+	dojo.addOnLoad(function(){
+		dojo.experimental(_loader.toString());
+		var undo = dojo.evalObjPath("dojo.undo.browser");
+		if(djConfig["preventBackButtonFix"] && undo && !undo.initialState){
+			undo.setInitialState(new trackerObj);
+		}
+	});
+
+	var logger = {};
+	var trackerObj = function(id, data){
+		this.id = id;
+		this.data = data
+	};
+	trackerObj.prototype.handle = function(type){
+		if(typeof dojo == 'undefined'){ return; } // wtf? how can dojo become undef?
+		var wg = dojo.widget.byId(this.id);
+		if(wg){ wg.setContent(this.data, true); }
+	};
+
+	this._log = function(widget, data){
+		// if a loader widget B is a child of loader widget A
+		// we need to destroy all of B's undo if we switch content
+		if(widget.trackHistory){
+			if(!logger[widget.widgetId]){
+				logger[widget.widgetId] = { childrenIds: [], stack:[data] };
+			}var children = logger[widget.widgetId].childrenIds;
+			while(children && children.length){
+				delete logger[children.pop()];
+			}
+			for(var child in widget.children){
+				logger[widget.widgetId].childrenIds = child.widgetId;
+			}
+			dojo.undo.browser.addToHistory(new trackerObj(widget.widgetId, dojo.lang.shallowCopy(data, true)));
+		}
+	}
+
+	// shortCuts
+	var undef = dojo.lang.isUndefined;
+	var isFunc = dojo.lang.isFunction;
+
+
+
+	/************ private needed functions, no need to be part of widget API ***********/
+	// useful if user wants to prevent default behaviour ie: _setContent("Error...")
+	function handleDefaults(e, handler, useAlert){
+		if(!handler){ handler = "onContentError"; }
+		if(dojo.lang.isString(e)){ e = {_text: e}; }
+		if(!e._text){ e._text = e.toString(); }
+		e.toString = function(){ return this._text; };
+		if(typeof e.returnValue != "boolean"){
+			e.returnValue = true; 
+		}
+		if(typeof e.preventDefault != "function"){
+			e.preventDefault = function(){ this.returnValue = false; };
+		}
+		// call our handler
+		this[handler](e);
+		if(e.returnValue){
+			if(useAlert){
+				alert(e.toString());
+			}else{
+				this.loader.callOnUnLoad.call(this, false);
+				this.onSetContent(e.toString());
+			}
+		}
+	};
+
+	// set up downloader, used by both scripts and content
+	function downloader(bindArgs) {
+		for(var x in this.bindArgs){
+			bindArgs[x] = (undef(bindArgs[x]) ? this.bindArgs[x] : undefined);
+		}
+		var cache = this.cacheContent;
+		if(undef(bindArgs.useCache)){ bindArgs.useCache = cache; }
+		if(undef(bindArgs.preventCache)){ bindArgs.preventCache = !cache; }
+		if(undef(bindArgs.mimetype)){ bindArgs.mimetype = "text/html"; }
+		this.loader.bindObj = dojo.io.bind(bindArgs);
+	};
+
+	// runs addOnLoad/addOnUnLoad functions
+	function stackRunner(st){
+		var err = "", func = null;
+		var scope = this.scriptScope || dojo.global();
+		while(st.length){
+			func = st.shift();
+			try{
+				func.call(scope);
+			}catch(e){
+				err += "\n"+func+" failed: "+e;
+			}
+		}
+		if(err.length){
+			var name = (st== this.loader.addOnLoads) ? "addOnLoad" : "addOnUnLoad";
+			handleDefaults.call(this, name+" failure\n "+err, "onExecError", true);
+		}
+	};
+
+	// push addOnLoad and addOnUnLoad functions onto stack
+	function stackPusher(st, obj, func){
+		if(typeof func == 'undefined') {
+			st.push(obj);
+		}else{
+			st.push(function(){ obj[func](); });
+		}
+	};
+
+	// code saver, collects onLoad, onResized and isLoaded
+	function refreshed(){
+		this.onResized();
+		this.onLoad();
+		this.isLoaded = true;
+	};
+
+	// runs scripts and starts the content parser
+	function asyncParse(data){
+		if(this.executeScripts){
+			this.onExecScript.call(this, data.scripts);
+		}
+		if(this.parseContent){
+			this.onContentParse.call(this);
+		}
+		refreshed.call(this);
+	};
+
+	// run java function
+	function runHandler(){
+		//FIXME: current behaviour is to return false if handler is there; is that intended?
+		if(dojo.lang.isFunction(this.handler)) {
+			this.handler(this, this.containerNode||this.domNode);
+			refreshed.call(this);
+			return false;
+		}
+		return true;
+	};
+
+	// divided up splitAndFixPaths in different parts
+	this.htmlContentBasicFix = function(/*string*/s, /*string||dojo.uri.Uri*/url){
+		// summary:
+		//	strips out <style, <link rel=stylesheet and <title tags
+		//	intended to take out tags that might cause DOM faults
+		var titles = [], styles = [];
+		/************** <title> ***********/
+		// khtml can't attach a <style> or <title> node as child of body
+		var regex = /<title[^>]*>([\s\S]*?)<\/title>/i;
+		var match, attr;
+		while(match = regex.exec(s)){
+			titles.push(match[1]);
+			s = s.substring(0, match.index) + s.substr(match.index + match[0].length);
+		};
+		/****************  cut out all <style> and <link rel="stylesheet" href=".."> **************/
+		regex = /(?:<(style)[^>]*>([\s\S]*?)<\/style>|<link ([^>]*rel=['"]?stylesheet['"]?[^>]*)>)/i;
+		while(match = regex.exec(s)){
+			if(match[1] && match[1].toLowerCase() == "style"){
+				styles.push(dojo.html.fixPathsInCssText(match[2],url));
+			}else if(attr = match[3].match(/href=(['"]?)([^'">]*)\1/i)){
+				styles.push({path: attr[2]});
+			}
+			s = s.substring(0, match.index) + s.substr(match.index + match[0].length);
+		};
+		return {'s': s, 'titles': titles, 'styles': styles};//object
+	};
+
+	this.htmlContentAdjustPaths = function(/*string*/s, /*string||dojo.uri.Uri*/url){
+		// summary:
+		//	adjusts relative paths in content to be relative to current page
+		var tag = "", str = "", tagFix = "", path = "";
+		var attr = [], origPath = "", fix = "";
+
+		// attributepaths one tag can have multiple paths example:
+		// <input src="..." style="url(..)"/> or <a style="url(..)" href="..">
+		// strip out the tag and run fix on that.
+		// this guarantees that we won't run replace on another tag's attribute + it was easier do
+		var regexFindTag = /<[a-z][a-z0-9]*[^>]*\s(?:(?:src|href|style)=[^>])+[^>]*>/i;
+		var regexFindAttr = /\s(src|href|style)=(['"]?)([\w()\[\]\/.,\\'"-:;#=&?\s@]+?)\2/i;
+		// these are the supported protocols, all other is considered relative
+		var regexProtocols = /^(?:[#]|(?:(?:https?|ftps?|file|javascript|mailto|news):))/;
+
+		while(tag = regexFindTag.exec(s)){
+			str += s.substring(0, tag.index);
+			s = s.substring((tag.index + tag[0].length), s.length);
+			tag = tag[0];
+
+			// loop through attributes
+			tagFix = '';
+			while(attr = regexFindAttr.exec(tag)){
+				path = ""; origPath = attr[3];
+				switch(attr[1].toLowerCase()){
+					case "src":// falltrough
+					case "href":
+						if(regexProtocols.exec(origPath)){
+							path = origPath;
+						} else {
+							path = (new dojo.uri.Uri(url, origPath).toString());
+						}
+						break;
+					case "style":// style
+						path = dojo.html.fixPathsInCssText(origPath, url);
+						break;
+					default:
+						path = origPath;
+				}
+
+				fix = " " + attr[1] + "=" + attr[2] + path + attr[2];
+
+				// slices up tag before next attribute check
+				tagFix += tag.substring(0, attr.index) + fix;
+				tag = tag.substring((attr.index + attr[0].length), tag.length);
+			}
+			str += tagFix + tag;
+		}
+		return str+s; // string
+	};
+
+
+	this.htmlContentScripts = function(/*string*/s, /*boolean*/collectScripts){
+		// summary:
+		// 	handles scripts and dojo .require(...) etc calls
+		// NOTE: we need to go through here even if we have executeScripts=false
+		//		 and if we have parseWidgets true 
+		var scripts = [], requires = [], match = [];
+		var attr = "", tmp = null, tag = "", sc = "", str = "";
+		
+		/***************** cut out all <script> tags, push them into scripts array ***************/
+		var regex = /<script([^>]*)>([\s\S]*?)<\/script>/i;
+		var regexSrc = /src=(['"]?)([^"']*)\1/i;
+		var regexDojoJs = /.*(\bdojo\b\.js(?:\.uncompressed\.js)?)$/;
+		var regexInvalid = /(?:var )?\bdjConfig\b(?:[\s]*=[\s]*\{[^}]+\}|\.[\w]*[\s]*=[\s]*[^;\n]*)?;?|dojo\.hostenv\.writeIncludes\(\s*\);?/g;
+		var regexRequires = /dojo\.(?:(?:require(?:After)?(?:If)?)|(?:widget\.(?:manager\.)?registerWidgetPackage)|(?:(?:hostenv\.)?setModulePrefix)|defineNamespace)\((['"]).*?\1\)\s*;?/;
+
+		while(match = regex.exec(s)){
+			if(this.executeScripts && match[1]){
+				if(attr = regexSrc.exec(match[1])){
+					// remove a dojo.js or dojo.js.uncompressed.js from remoteScripts
+					// we declare all files named dojo.js as bad, regardless of path
+					if(regexDojoJs.exec(attr[2])){
+						dojo.debug("Security note! inhibit:"+attr[2]+" from  beeing loaded again.");
+					}else{
+						scripts.push({path: attr[2]});
+					}
+				}
+			}
+			if(match[2]){
+				// remove all invalid variables etc like djConfig and dojo.hostenv.writeIncludes()
+				sc = match[2].replace(regexInvalid, "");
+				if(!sc){ continue; }
+
+				// cut out all dojo .require (...) calls, if we have execute 
+				// scripts false widgets don't get their require calls
+				// takes out possible widgetpackage registration as well
+				while(tmp = regexRequires.exec(sc)){
+					requires.push(tmp[0]);
+					sc = sc.substring(0, tmp.index) + sc.substr(tmp.index + tmp[0].length);
+				}
+				if(collectScripts){
+					scripts.push(sc);
+				}
+			}
+			s = s.substr(0, match.index) + s.substr(match.index + match[0].length);
+		}
+		/******** scan for scriptScope in html eventHandlers 
+					and replace with link to this widget *********/
+		if(collectScripts){
+			var regex = /(<[a-zA-Z][a-zA-Z0-9]*\s[^>]*\S=(['"])[^>]*[^\.\]])scriptScope([^>]*>)/;
+			str = "";
+			while(tag = regex.exec(s)){
+				tmp = ((tag[2]=="'") ? '"': "'");
+				str += s.substring(0, tag.index);
+				s = s.substr(tag.index).replace(regex, "$1dojo.widget.byId("+ tmp + this.widgetId + tmp + ").scriptScope$3");
+			}
+			s = str + s;
+		}
+		return {'s': s, 'requires': requires, 'scripts': scripts}; // object
+	};
+
+		
+	this.splitAndFixPaths = function(/*object*/args){
+		// summary:
+		//	pathfixes, require calls, css stuff and neccesary content clean
+		// args:
+		//	content 		string
+		//	url 			string? or dojo.uri.Uri that that pulled the content in, for path adjust
+		//	adjustPaths		boolean, if true adjust relative paths in content to match this page
+		//	collectScripts	boolean, if true it takes out all <script and <script src=.. tags and collects
+		//					 dojo.require calls in a separate array, useful for eval
+		//	collectRequires	boolean, if true and collectScripts is false it still collects scripts along with
+		//					 dojo.require calls
+		//	bodyExtract		boolean, if true only return content inside of the body tag
+
+		// return:			{xml: string,
+		//					styles: array, remote style get object {path: /*string*/url}
+		//					requires: array,
+		//					scripts: array, remote scripts get object {path: /*string*/url}
+		//					url: string}
+		if(!args.url) { args.url = "./"; } // point to this page if not set
+		// make sure back/forward buttons don't mess up url.
+		url = new dojo.uri.Uri(location, args.url).toString();
+		var ret = {'xml': 	"",
+				'styles':	[],
+				'titles':	[],
+				'requires':	[],
+				'scripts':	[],
+				'url':		url };
+
+		if(args.content){ // make sure we don't run regexes on empty content
+			var tmp = null, content = args.content;
+			if(args.adjustPaths){
+				content = _loader.htmlContentAdjustPaths.call(this, content, url);
+			}
+
+			tmp = _loader.htmlContentBasicFix.call(this, content, url);
+			content = tmp.s;
+			ret.styles = tmp.styles;
+			ret.titles = tmp.titles;
+
+			if(args.collectRequires || args.collectScripts){
+				tmp = _loader.htmlContentScripts.call(this, content, args.collectScripts);
+				content = tmp.s;
+				ret.requires = tmp.requires;
+				ret.scripts = tmp.scripts;
+			}
+
+			/********* extract content *********/
+			var match = [];
+			if(args.bodyExtract){
+				match = content.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+				if(match) { content = match[1]; }
+			}
+			ret.xml = content;
+		}
+		return ret;// object 
+	};
+
+
+	// the all important startup function
+	this.hookUp = function(/*object*/args){
+		// summary:
+		// 	mixin or extend loader into a widget
+		// args:
+		//	widget: widget reference
+		//	mixin: boolean, default false
+		// 		if mixin true, it will only extend the current widget, not its prototype
+		var widget = args.widget;
+		if(dojo.lang.isString(widget)){
+			if(args.mixin){	
+				dojo.raise(this.toString()+", cant use mixin when widget is a string");
+			 }
+			widget = dojo.evalObjPath(widget);
+		}
+		if(!widget || !(widget instanceof dojo.widget.HtmlWidget)){
+			dojo.raise(this.toString()+" Widget isn't defined or isn't a HtmlWidget instance"); 
+		}
+		// make sure we don't mixin more than once
+		if(widget.loader && widget.setUrl){ return; }
+
+		// extend widget prototype or mixin this widget instance
+		var widgetProto = (args.mixin) ? widget : widget.constructor.prototype;
+	
+		/********************************************
+		** per widgetImpl variables, mixin into widget 
+		********************************************/
+		// stuff it into a loader obj
+		widget.loader = {
+			isLoaded: false,
+			styleNodes:  [],
+			addOnLoads: [],
+			addOnUnLoads: [],
+			callOnUnLoad:(function(canCall){
+							return function(after){ this.abort();
+								if(canCall){ this.onUnLoad(); }
+								canCall = after;
+							};
+						})(false),
+			bindObj: null,
+			// to disconnect widget
+			unHook: (function(w, wg){
+				var oldProps = {
+					isContainer: w.isContainer,
+					adjustPats: w.adjustPaths,
+					href: w.href,
+					extractContent: w.extractContent,
+					parseContent: w.parseContent,
+					cacheContent: w.cacheContent,
+					bindArgs: w.bindArgs,
+					preload: w.preload,
+					refreshOnShow: w.refreshOnShow,
+					handler: w.handler,
+					trackHistory: w.trackHistory,
+					executeScripts: w.executeScripts,
+					scriptScope: w.scriptScope,
+					// functions
+					postCreate: w.postCreate,
+					show: w.show,
+					refresh: w.refresh,
+					loadContents: w.loadContents,
+					abort: w.abort,
+					destroy: w.destroy,
+					onLoad: w.onLoad,
+					onUnLoad: w.onUnLoad,
+					addOnLoad: w.addOnLoad,
+					addOnUnLoad: w.addOnUnLoad,
+					onDownloadStart: w.onDownloadStart,
+					onDownloadEnd: w.onDownloadEnd,
+					onDownloadError: w.onDownloadError,
+					onContentError: w.onContentError,
+					onExecError: w.onExecError,
+					onSetContent: w.onSetContent,
+					setUrl: w.setUrl,
+					setContent: w.setContent,
+					onContentParse: w.onContentParse,
+					onExecScript: w.onExecScript,
+					setHandler: w.setHandler
+				};
+				return function(){
+					if(wg.abort){ wg.abort(); }
+					// make sure we don't unhook prototype if there are more widgets of this type left
+					if((w != wg) && (dojo.widget.byType(wg.widgetType).length>1)){ return; }
+					for(var x in oldProps){
+						if(oldProps[x]===undefined){
+							delete w[x]; continue;
+						}
+						w[x] = oldProps[x];
+					}
+					delete wg._loader_defined;
+					delete wg.loader;
+				};
+			})(widgetProto, widget)
+		};
+
+		// make sure we don't do this more than once per widget/widgetprototype
+		if(widgetProto._loader_defined || widget._loader_defined){ return; }		
+
+		/**************** private variables *********************/
+
+		// loading options, prototype parts of widget's mixin to prototype
+		dojo.mixin(widgetProto, {
+			// always set to a containerwidget
+			isContainer: true,
+			// fix relative paths in content to fit into this page
+			adjustPaths: 	undef(widgetProto.adjustPaths) ? true : widgetProto.adjustPaths,
+			// only usable on construction, use setUrl or setContent after that
+			href: 			undef(widgetProto.href) ? "" : widgetProto.href,
+			// extract visible content from inside of <body> .... </body>
+			extractContent: undef(widgetProto.extractContent) ? true : widgetProto.extractContent,
+			// construct all widgets that is in content
+			// FIXME: rename to parseWidgets?
+			parseContent: 	undef(widgetProto.parseContent) ? true : widgetProto.parseContent,
+			// use io binds javascript cache, or if false, prevent browsercache
+			cacheContent: 	undef(widgetProto.cacheContent) ? true : widgetProto.cacheContent,
+			// specify  specific  io.bind arguments such as transport and useCache
+			bindArgs:		undef(widgetProto.bindArgs) ? {} : widgetProto.bindArgs,
+			// force load even if widget isn't shown (lazyload setting)
+			preload: 		undef(widgetProto.preload) ? false : widgetProto.preload,
+			// reload content automatically onShow, use with cacheContent = flase
+			refreshOnShow:	undef(widgetProto.refreshOnShow) ? false : widgetProto.refreshOnShow,
+			// name of java function which should generate content
+			handler: 		undef(widgetProto.handler) ? "" : widgetProto.handler,
+			// if true scripts in content will be evaled after content is innerHTML'ed
+			executeScripts: undef(widgetProto.executeScripts) ? false : widgetProto.executeScripts,
+			// log contents (back/forward support)
+			trackHistory:	undef(widgetProto.tracHistory) ? false : widgetProto.trackHistory,
+			scriptScope: null // always overwrite
+		});
+
+		/****************************************************
+		******* public functions, becomes part of widget's API
+		*****************************************************/
+
+		/*********** Public functions that wigets cant overide **********/
+		// set up postCreate, call originalcode before our own
+		widgetProto.postCreate = (function(postCreate){
+			return function(){
+				if(widgetProto.constructor.superclass.postCreate != postCreate){
+					postCreate.apply(this, arguments);
+				}else{
+					widgetProto.constructor.superclass.postCreate.apply(this, arguments);
+				}
+				if(this.handler!==""){ this.setHandler(this.handler); }
+				if(this.isShowing() || this.preload){ 
+					this.loadContents();
+					if(!this.href){ // back/forward save initial state
+						_loader._log(this,(this.domNode||this.containerNode).innerHTML);
+					}
+				}
+			}
+		})(widgetProto.postCreate);
+
+		// set up onShow listener, call original code after this block
+		widgetProto.show = (function(show){
+			return function(){
+				// if refreshOnShow is true, reload the contents every time; otherwise, load only the first time
+				if(this.refreshOnShow){
+					this.refresh();
+				}else{ 
+					this.loadContents();
+				}
+				if((widgetProto.constructor.superclass.show == show) || !isFunc(show)){
+					widgetProto.constructor.superclass.show.apply(this, arguments);
+				}else{
+					show.apply(this, arguments);
+				}
+			};
+		})(widgetProto.show);
+
+		// destroy cleanups, original code in the middle
+		widgetProto.destroy = (function(destroy){
+			return function(destroy){
+				this.onUnLoad();
+				this.abort();
+				this.loader.unHook();
+				if((widgetProto.constructor.superclass.destroy != destroy) && isFunc(destroy)){
+					destroy.apply(this, arguments);
+				}else{
+					widgetProto.constructor.superclass.destroy.apply(this, arguments);
+				}
+			}
+		})(widgetProto.destroy);
+
+
+		/******* Public functions that widgets can overide *****/
+		// set up a refresh function
+		if(!widgetProto.refresh){
+			widgetProto.refresh = function(){
+				this.loader.isLoaded = false;
+				this.loadContents();
+			};
+		}
+
+		// set up html loading contents
+		if(!widgetProto.loadContents){
+			widgetProto.loadContents = function(){
+				if(this.loader.isLoaded){ return; }
+				// javafunction
+				if(isFunc(this.handler)){
+					runHandler.call(this);
+				}else if(this.href !== ""){
+					handleDefaults.call(this, "Loading...", "onDownloadStart");
+					var self = this, url = this.href;
+					downloader.call(this, {
+						url: url,
+						load: function(type, data, xhr){
+							self.onDownloadEnd.call(self, url, data);
+						},
+						error: function(type, err, xhr){
+							// XHR insnt a normal JS object, copy esentials
+							var e = {
+								responseText: xhr.responseText,
+								status: xhr.status,
+								statusText: xhr.statusText,
+								responseHeaders: (xhr.getAllResponseHeaders) ? xhr.getAllResponseHeaders():[],
+								_text: "Error loading '" + url + "' (" + xhr.status + " "+  xhr.statusText + ")"
+							};
+							handleDefaults.call(self, e, "onDownloadError");
+							self.onLoad();
+						}
+					});
+				}
+			};
+		}
+
+		// set up abort
+		if(!widgetProto.abort){
+			widgetProto.abort = function(){
+				if(!this.loader || !this.loader.bindObj || !this.loader.bindObj.abort){ return; }
+				this.loader.bindObj.abort();
+				this.loader.bindObj = null;
+			};
+		}
+
+		// onLoad
+		if(!widgetProto.onLoad){
+			widgetProto.onLoad = function(){
+				stackRunner.call(this, this.loader.addOnLoads);
+				this.loader.isLoaded = true;
+			};
+		}
+
+		// onUnLoad, original code in the middle
+		if(!widgetProto.onUnLoad){
+			widgetProto.onUnLoad = function(){
+				stackRunner.call(this, this.loader.addOnUnLoads);
+				delete this.scriptScope;
+			}
+		}
+
+		// add to onLoad queue
+		if(!widgetProto.addOnLoad){
+			widgetProto.addOnLoad = function(obj, func){
+				stackPusher.call(this, this.loader.addOnLoads, obj, func);
+			};
+		}
+
+		// add to onUnLoad queue 
+		if(!widgetProto.addOnUnLoad){
+			widgetProto.addOnUnLoad = function(obj, func){
+				stackPusher.call(this, this.loader.addOnUnLoads, obj, func);
+			}
+		}
+
+		// script or java errors, preventDefault-able
+		if(!widgetProto.onExecError){
+			widgetProto.onExecError = function(){/*stub*/};
+		}
+	
+		// called on DOM faults, require fault etc in content, preventDefault-able
+		if(!widgetProto.onContentError){
+			widgetProto.onContentError = function(){/*stub*/};
+		}
+	
+		// called when download error occurs, preventDefault-able
+		if(!widgetProto.onDownloadError){
+			widgetProto.onDownloadError = function(){/*stub*/};
+		}
+	
+		// called before download starts, preventDefault-able
+		if(!widgetProto.onDownloadStart){
+			widgetProto.onDownloadStart = function(onDownloadStart){/*stub*/};
+		}
+	
+		// called when download is finished successfully
+		if(!widgetProto.onDownloadEnd){
+			widgetProto.onDownloadEnd = function(url, data){
+				var args =  {content: data,
+							url: url,
+							adjustPaths: this.adjustPaths,
+							collectScripts: this.executeScripts,
+							collectRequires: this.parseContent,
+							bodyExtract: this.extractContent };
+				data = _loader.splitAndFixPaths.call(this, args);
+				this.setContent(data);
+			}
+		}
+
+		// previously called _setContent, widget defined onSetContent can modify content or cancel
+		if(!widgetProto.onSetContent){
+			widgetProto.onSetContent = function(cont){
+				this.destroyChildren();
+		
+				// remove old stylenodes from HEAD
+				var styleNodes = this.loader.styleNodes;
+				while(styleNodes.length){
+					var st = styleNodes.pop();
+					if(st && st.parentNode){
+						st.parentNode.removeChild(st);
+					}
+				}
+		
+				var node = this.containerNode || this.domNode;
+				while(node.firstChild){
+					try{
+						dojo.event.browser.clean(node.firstChild);
+					}catch(e){}
+					node.removeChild(node.firstChild);
+				}
+				try{
+					if(typeof cont != "string"){
+						node.appendChild(cont);
+					}else{
+						try{// hack to deal with domfaults, ie. appending div to tablenodes
+							node.innerHTML = cont;
+						}catch(e){var tmp;
+							(tmp = dojo.doc().createElement("div")).innerHTML = cont;
+							while(tmp.firstChild){
+								node.appendChild(tmp.removeChild(tmp.firstChild));
+							}
+						}
+					}
+				}catch(e){
+					e._text = "Could'nt load content: "+e;
+					var useAlert = (this.loader._onSetContent_err == e._text); // make sure we don't loop
+					this.loader._onSetContent_err = e._text;
+					handleDefaults.call(this, e, "onContentError", useAlert);
+				}
+			};
+		}
+
+		if(!widgetProto.setUrl){
+			widgetProto.setUrl = function(url){
+				this.href = url;
+				this.loader.isLoaded = false;
+				if ( this.preload || this.isShowing() ){
+					this.loadContents();
+				}
+			}
+		}
+
+		if(!widgetProto.setContent){
+			widgetProto.setContent = function(data, dontLog){
+				this.loader.callOnUnLoad.call(this, true);
+		
+				if(!data||dojo.html.isNode(data)){
+					this.onSetContent(data);
+					refreshed.call(this);
+				}else{
+					// need to run splitAndFixPaths? ie. manually setting content
+					// adjustPaths is taken care of inside splitAndFixPaths
+					if(typeof data.xml != 'string'){
+						this.href = ""; // so we can refresh safely
+						var args =  {content: data,
+							url: this.href,
+							adjustPaths: this.adjustPaths,
+							collectScripts: this.executeScripts,
+							collectRequires: this.parseContent,
+							bodyExtract: this.extractContent };
+						data = _loader.splitAndFixPaths.call(this, args); 
+					}else if(data.url!="./"){
+						 this.url = data.url;// backbutton thing
+					}
+					this.onSetContent(data.xml);
+	
+					// insert styles from content (in same order they came in)
+					for(var i = 0, styles = data.styles; i < styles.length; i++){
+						if(styles[i].path){
+							this.loader.styleNodes.push(dojo.html.insertCssFile(styles[i].path));
+						}else{
+							this.loader.styleNodes.push(dojo.html.insertCssText(styles[i]));
+						}
+					}
+		
+					if(this.parseContent){
+						for(var i = 0, requires = data.requires; i < requires.length; i++){
+							try{
+								eval(requires[i]);
+							} catch(e){
+								e._text = "dojo.widget.html.loader.hookUp: error in package loading calls, "+(e.description||e);
+								handleDefaults.call(this, e, "onContentError", true);
+							}
+						}
+					}
+					// need to allow async load, Xdomain uses it
+					// NOTE: on Xdomain loads this can break the sync thread of setContent
+					// 		if you you do any dojo. require(...) etc
+					if(dojo.hostenv.isXDomain && data.requires.length){
+						dojo.addOnLoad(function(){ 
+							asyncParse.call(this, data);
+							if(!dontLog){
+								_loader._log(this, data);
+							}
+						});// this opens a thread need abort undo
+						dontLog = true;
+					}else{
+						asyncParse.call(this, data);
+					}
+				}if(!dontLog){
+// 					_loader._log(this, data);
+				}
+			};
+		}
+
+		if(!widgetProto.onContentParse){
+			widgetProto.onContentParse = function(){
+				var node = this.containerNode || this.domNode;
+				var parser = new dojo.xml.Parse();
+				var frag = parser.parseElement(node, null, true);
+				dojo.widget.getParser().createSubComponents(frag, this);
+			};
+		}
+
+		// previously called _executeScripts
+		if(!widgetProto.onExecScript){
+			widgetProto.onExecScript = function(scripts){
+				// loop through the scripts in the order they came in
+				var self = this, tmp = "", code = "";
+				for(var i = 0; i < scripts.length; i++){ // remotescript
+					if(scripts[i].path){
+						var url = scripts[i].path;
+						downloader.call(this,{
+							'url': 		url,
+							'load': function(type, scriptStr){
+								(function(){tmp = scriptStr; scripts[i] = scriptStr;}).call(self);
+							},
+							'error': function(type, error){
+								error._text = type + " downloading remote script";
+								handleDefaults.call(self, error, "onExecError", true);
+							},
+							'mimetype': "text/plain",
+							'sync':     true
+						});
+						code += tmp;
+					}else{
+						code += scripts[i];
+					}
+				}
+
+				try{
+					// initialize a new anonymous container for our script, don't make it part of this widget's scope chain
+					// instead send in a variable that points to this widget, useful to connect events to onLoad, onUnLoad etc..
+					delete this.scriptScope;
+					this.scriptScope = new (new Function('_container_', code+'; return this;'))(self);
+				}catch(e){
+					e._text = "Error running scripts from content:\n"+(e.description||e.toString());
+					handleDefaults.call(this, e, "onExecError", true);
+				}
+			};
+		}
+
+		// Generate content from given java function
+		if(!widgetProto.setHandler){
+			widgetProto.setHandler = function(handler) {
+				var fcn = dojo.lang.isFunction(handler) ? handler : window[handler];
+				if(!isFunc(fcn)) {
+					// FIXME: needs testing! somebody with java knowledge needs to try this
+					handleDefaults.call(this, "Unable to set handler, '" + handler + "' not a function.", "onExecError", true);
+					return;
+				}
+				this.handler = function() {
+					return fcn.apply(this, arguments);
+				};
+			};
+		}
+
+		// make sure we extend this widget only once
+		widgetProto._loader_defined = true;
+	};
+
+
+})();



Mime
View raw message