text: // wrapped by build app
  define("dojox/data/StoreExplorer", ["dojo","dijit","dojox","dojo/require!dojox/grid/DataGrid,dojox/data/ItemExplorer,dijit/layout/BorderContainer,dijit/layout/ContentPane"], function(dojo,dijit,dojox){
  dojo.provide("dojox.data.StoreExplorer");
  dojo.require("dojox.grid.DataGrid");
  dojo.require("dojox.data.ItemExplorer");
  dojo.require("dijit.layout.BorderContainer");
  dojo.require("dijit.layout.ContentPane");
  
  dojo.declare("dojox.data.StoreExplorer", dijit.layout.BorderContainer, {
  	constructor: function(options){
  		dojo.mixin(this, options);
  	},
  	store: null,
  	columnWidth: '',
  	stringQueries: false,
  	showAllColumns: false,
  	postCreate: function(){
  		var self = this;
  		this.inherited(arguments);
  		var contentPane = new dijit.layout.ContentPane({
  			region:'top'
  		}).placeAt(this);
  		function addButton(name, action){
  			var button = new dijit.form.Button({label: name});
  			contentPane.containerNode.appendChild(button.domNode);
  			button.onClick = action;
  			return button;
  		}
  		var queryText = contentPane.containerNode.appendChild(document.createElement("span"));
  		queryText.innerHTML = "Enter query: &nbsp;";
  		queryText.id = "queryText";
  		var queryTextBox = contentPane.containerNode.appendChild(document.createElement("input"));
  		queryTextBox.type = "text";
  		queryTextBox.id = "queryTextBox";
  		addButton("Query",function(){
  			var query = queryTextBox.value;
  			self.setQuery(self.stringQueries ? query : dojo.fromJson(query));
  		});
  		contentPane.containerNode.appendChild(document.createElement("span")).innerHTML = "&nbsp;&nbsp;&nbsp;";
  		var createNewButton = addButton("Create New", dojo.hitch(this, "createNew"));
  		var deleteButton = addButton("Delete",function(){
  			var items = grid.selection.getSelected();
  			for(var i = 0; i < items.length; i++){
  				self.store.deleteItem(items[i]);
  			}
  		});
  		this.setItemName = function(name){
  			createNewButton.attr('label',"<img style='width:12px; height:12px' src='" + dojo.moduleUrl("dijit.themes.tundra.images","dndCopy.png") + "' /> Create New " + name);
  			deleteButton.attr('label',"Delete " + name);
  		};
  		addButton("Save",function(){
  			self.store.save({onError:function(error){
  				alert(error);
  			}});
  			//refresh the tree
  			self.tree.refreshItem();
  		});
  		addButton("Revert",function(){
  			self.store.revert();
  		});
  		addButton("Add Column", function(){
  			var columnName = prompt("Enter column name:","property");
  			if(columnName){
  				self.gridLayout.push({
  						field: columnName,
  						name: columnName,
  						formatter: dojo.hitch(self,"_formatCell"),
  						editable: true
  					});
  				self.grid.attr("structure",self.gridLayout);
  			}
  		});
  		var centerCP = new dijit.layout.ContentPane({
  			region:'center'
  		}).placeAt(this);
  		var grid = this.grid = new dojox.grid.DataGrid(
  				{store: this.store}
  			);
  		centerCP.attr("content", grid);
  		grid.canEdit = function(inCell, inRowIndex){
  			var value = this._copyAttr(inRowIndex, inCell.field);
  			return !(value && typeof value == 'object') || value instanceof Date;
  		}
  
  		var trailingCP = new dijit.layout.ContentPane({
  			region: 'trailing',
  			splitter: true,
  			style: "width: 300px"
  		}).placeAt(this);
  
  		var tree = this.tree = new dojox.data.ItemExplorer({
  			store: this.store}
  			);
  		trailingCP.attr("content", tree);
  
  		dojo.connect(grid, "onCellClick", function(){
  			var selected = grid.selection.getSelected()[0];
  			tree.setItem(selected);
  		});
  
  		this.gridOnFetchComplete = grid._onFetchComplete;
  		this.setStore(this.store);
  	},
  	setQuery: function(query, options){
  		this.grid.setQuery(query, options);
  	},
  	_formatCell: function(value){
  		if(this.store.isItem(value)){
  			return this.store.getLabel(value) || this.store.getIdentity(value);
  		}
  		return value;
  	},
  	setStore: function(store){
  		this.store = store;
  		var self = this;
  		var grid = this.grid;
  		grid._pending_requests[0] = false;
  		function formatCell(value){
  			return self._formatCell(value);
  		}
  		var defaultOnComplete = this.gridOnFetchComplete;
  		grid._onFetchComplete = function(items, req){
  			var layout = self.gridLayout = [];
  			var column, key, item, i, j, k, idAttributes = store.getIdentityAttributes();
  			for(i = 0; i < idAttributes.length; i++){
  				key = idAttributes[i];
  				layout.push({
  					field: key,
  					name: key,
  					_score: 100,
  					formatter: formatCell,
  					editable: false
  				});
  
  			}
  			for(i=0; item = items[i++];){
  				var keys = store.getAttributes(item);
  				for(k=0; key = keys[k++];){
  					var found = false;
  					for(j=0; column = layout[j++];){
  						if(column.field == key){
  							column._score++;
  							found = true;
  							break;
  						}
  					}
  					if(!found){
  						layout.push({
  							field: key,
  							name: key,
  							_score: 1,
  							formatter: formatCell,
  							styles: "white-space:nowrap; ",
  							editable: true
  						});
  					}
  				}
  			}
  			layout = layout.sort(function(a, b){
  				return  b._score - a._score;
  			});
  			if(!self.showAllColumns){
  				for(j=0; column=layout[j]; j++){
  					if(column._score < items.length/40 * j) {
  						layout.splice(j, layout.length-j);
  						break;
  					}
  				}
  			}
  			for(j=0; column = layout[j++];){
  				column.width=self.columnWidth || Math.round(100/layout.length) + '%';
  			}
  			grid._onFetchComplete = defaultOnComplete;
  			grid.attr("structure",layout);
  			var retValue = defaultOnComplete.apply(this, arguments);
  
  		}
   		grid.setStore(store);
   		this.queryOptions = {cache:true};
  		this.tree.setStore(store);
  	},
  	createNew: function(){
  		var props = prompt("Enter any properties (in JSON literal form) to put in the new item (passed to the newItem constructor):","{ }");
  		if(props){
  			try{
  				this.store.newItem(dojo.fromJson(props));
  			}catch(e){
  				alert(e);
  			}
  
  		}
  	}
  });
  
  });
  