/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.grid._TreeView"]){
dojo._hasResource["dojox.grid._TreeView"]=true;
dojo.provide("dojox.grid._TreeView");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.require("dojox.grid._View");
dojo.declare("dojox.grid._Expando",[dijit._Widget,dijit._Templated],{open:false,toggleClass:"",itemId:"",cellIdx:-1,view:null,rowNode:null,rowIdx:-1,expandoCell:null,level:0,templateString:"<div class=\"dojoxGridExpando\"\n\t><div class=\"dojoxGridExpandoNode\" dojoAttachEvent=\"onclick:onToggle\"\n\t\t><div class=\"dojoxGridExpandoNodeInner\" dojoAttachPoint=\"expandoInner\"></div\n\t></div\n></div>\n",_toggleRows:function(_1,_2){
if(!_1||!this.rowNode){
return;
}
if(dojo.query("table.dojoxGridRowTableNeedsRowUpdate").length){
if(this._initialized){
this.view.grid.updateRow(this.rowIdx);
}
return;
}
var _3=this;
var g=this.view.grid;
if(g.treeModel){
var p=this._tableRow?dojo.attr(this._tableRow,"dojoxTreeGridPath"):"";
if(p){
dojo.query("tr[dojoxTreeGridPath^=\""+p+"/\"]",this.rowNode).forEach(function(n){
var en=dojo.query(".dojoxGridExpando",n)[0];
if(en&&en.parentNode&&en.parentNode.parentNode&&!dojo.hasClass(en.parentNode.parentNode,"dojoxGridNoChildren")){
var ew=dijit.byNode(en);
if(ew){
ew._toggleRows(_1,ew.open&&_2);
}
}
n.style.display=_2?"":"none";
});
}
}else{
dojo.query("tr."+_1,this.rowNode).forEach(function(n){
if(dojo.hasClass(n,"dojoxGridExpandoRow")){
var en=dojo.query(".dojoxGridExpando",n)[0];
if(en){
var ew=dijit.byNode(en);
var _4=ew?ew.toggleClass:en.getAttribute("toggleClass");
var _5=ew?ew.open:_3.expandoCell.getOpenState(en.getAttribute("itemId"));
_3._toggleRows(_4,_5&&_2);
}
}
n.style.display=_2?"":"none";
});
}
},setOpen:function(_6){
if(_6&&dojo.hasClass(this.domNode,"dojoxGridExpandoLoading")){
_6=false;
}
var _7=this.view;
var _8=_7.grid;
var _9=_8.store;
var _a=_8.treeModel;
var d=this;
var _b=this.rowIdx;
var me=_8._by_idx[_b];
if(!me){
return;
}
if(_a&&!this._loadedChildren){
if(_6){
var _c=_8.getItem(dojo.attr(this._tableRow,"dojoxTreeGridPath"));
if(_c){
this.expandoInner.innerHTML="o";
dojo.addClass(this.domNode,"dojoxGridExpandoLoading");
_a.getChildren(_c,function(_d){
d._loadedChildren=true;
d._setOpen(_6);
});
}else{
this._setOpen(_6);
}
}else{
this._setOpen(_6);
}
}else{
if(!_a&&_9){
if(_6){
var _e=_8._by_idx[this.rowIdx];
if(_e&&!_9.isItemLoaded(_e.item)){
this.expandoInner.innerHTML="o";
dojo.addClass(this.domNode,"dojoxGridExpandoLoading");
_9.loadItem({item:_e.item,onItem:dojo.hitch(this,function(i){
var _f=_9.getIdentity(i);
_8._by_idty[_f]=_8._by_idx[this.rowIdx]={idty:_f,item:i};
this._setOpen(_6);
})});
}else{
this._setOpen(_6);
}
}else{
this._setOpen(_6);
}
}else{
this._setOpen(_6);
}
}
},_setOpen:function(_10){
if(_10&&this._tableRow&&dojo.hasClass(this._tableRow,"dojoxGridNoChildren")){
this._setOpen(false);
return;
}
this.expandoInner.innerHTML=_10?"-":"+";
dojo.removeClass(this.domNode,"dojoxGridExpandoLoading");
dojo.toggleClass(this.domNode,"dojoxGridExpandoOpened",_10);
if(this._tableRow){
dojo.toggleClass(this._tableRow,"dojoxGridRowCollapsed",!_10);
var _11=dojo.attr(this._tableRow,"dojoxTreeGridBaseClasses");
var _12="";
if(_10){
_12=dojo.trim((" "+_11+" ").replace(" dojoxGridRowCollapsed "," "));
}else{
if((" "+_11+" ").indexOf(" dojoxGridRowCollapsed ")<0){
_12=_11+(_11?" ":"")+"dojoxGridRowCollapsed";
}else{
_12=_11;
}
}
dojo.attr(this._tableRow,"dojoxTreeGridBaseClasses",_12);
}
var _13=(this.open!==_10);
this.open=_10;
if(this.expandoCell&&this.itemId){
this.expandoCell.openStates[this.itemId]=_10;
}
var v=this.view;
var g=v.grid;
if(this.toggleClass&&_13){
if(!this._tableRow||!this._tableRow.style.display){
this._toggleRows(this.toggleClass,_10);
}
}
if(v&&this._initialized&&this.rowIdx>=0){
g.rowHeightChanged(this.rowIdx);
g.postresize();
v.hasVScrollbar(true);
}
this._initialized=true;
},onToggle:function(e){
this.setOpen(!this.open);
dojo.stopEvent(e);
},setRowNode:function(_14,_15,_16){
if(this.cellIdx<0||!this.itemId){
return false;
}
this._initialized=false;
this.view=_16;
this.rowNode=_15;
this.rowIdx=_14;
this.expandoCell=_16.structure.cells[0][this.cellIdx];
var d=this.domNode;
if(d&&d.parentNode&&d.parentNode.parentNode){
this._tableRow=d.parentNode.parentNode;
}
this.open=this.expandoCell.getOpenState(this.itemId);
if(_16.grid.treeModel){
dojo.style(this.domNode,"marginLeft",(this.level*18)+"px");
if(this.domNode.parentNode){
dojo.style(this.domNode.parentNode,"backgroundPosition",((this.level*18)+(3))+"px");
}
}
this.setOpen(this.open);
return true;
}});
dojo.declare("dojox.grid._TreeContentBuilder",dojox.grid._ContentBuilder,{generateHtml:function(_17,_18){
var _19=this.getTableArray(),v=this.view,row=v.structure.cells[0],_1a=this.grid.getItem(_18),_1b=this.grid,_1c=this.grid.store;
dojox.grid.util.fire(this.view,"onBeforeRow",[_18,[row]]);
var _1d=function(_1e,_1f,_20,_21,_22,_23){
if(!_23){
if(_19[0].indexOf("dojoxGridRowTableNeedsRowUpdate")==-1){
_19[0]=_19[0].replace("dojoxGridRowTable","dojoxGridRowTable dojoxGridRowTableNeedsRowUpdate");
}
return;
}
var _24=_19.length;
_21=_21||[];
var _25=_21.join("|");
var _26=_21[_21.length-1];
var _27=_26+(_20?" dojoxGridSummaryRow":"");
var _28="";
if(_1b.treeModel&&_1f&&!_1b.treeModel.mayHaveChildren(_1f)){
_27+=" dojoxGridNoChildren";
}
_19.push("<tr style=\""+_28+"\" class=\""+_27+"\" dojoxTreeGridPath=\""+_22.join("/")+"\" dojoxTreeGridBaseClasses=\""+_27+"\">");
var _29=_1e+1;
var _2a=null;
for(var i=0,_2b;(_2b=row[i]);i++){
var m=_2b.markup,cc=_2b.customClasses=[],cs=_2b.customStyles=[];
m[5]=_2b.formatAtLevel(_22,_1f,_1e,_20,_26,cc);
m[1]=cc.join(" ");
m[3]=cs.join(";");
_19.push.apply(_19,m);
if(!_2a&&_2b.level===_29&&_2b.parentCell){
_2a=_2b.parentCell;
}
}
_19.push("</tr>");
if(_1f&&_1c&&_1c.isItem(_1f)){
var _2c=_1c.getIdentity(_1f);
if(typeof _1b._by_idty_paths[_2c]=="undefined"){
_1b._by_idty_paths[_2c]=_22.join("/");
}
}
var _2d;
var _2e;
var _2f;
var _30;
var _31=_22.concat([]);
if(_1b.treeModel&&_1f){
if(_1b.treeModel.mayHaveChildren(_1f)){
_2d=v.structure.cells[0][_1b.expandoCell||0];
_2e=_2d.getOpenState(_1f)&&_23;
_2f=new dojox.grid.TreePath(_22.join("/"),_1b);
_30=_2f.children(true)||[];
dojo.forEach(_30,function(_32,idx){
var _33=_25.split("|");
_33.push(_33[_33.length-1]+"-"+idx);
_31.push(idx);
_1d(_29,_32,false,_33,_31,_2e);
_31.pop();
});
}
}else{
if(_1f&&_2a&&!_20){
_2d=v.structure.cells[0][_2a.level];
_2e=_2d.getOpenState(_1f)&&_23;
if(_1c.hasAttribute(_1f,_2a.field)){
var _34=_25.split("|");
_34.pop();
_2f=new dojox.grid.TreePath(_22.join("/"),_1b);
_30=_2f.children(true)||[];
if(_30.length){
_19[_24]="<tr class=\""+_34.join(" ")+" dojoxGridExpandoRow\" dojoxTreeGridPath=\""+_22.join("/")+"\">";
dojo.forEach(_30,function(_35,idx){
var _36=_25.split("|");
_36.push(_36[_36.length-1]+"-"+idx);
_31.push(idx);
_1d(_29,_35,false,_36,_31,_2e);
_31.pop();
});
_31.push(_30.length);
_1d(_1e,_1f,true,_21,_31,_2e);
}else{
_19[_24]="<tr class=\""+_26+" dojoxGridNoChildren\" dojoxTreeGridPath=\""+_22.join("/")+"\">";
}
}else{
if(!_1c.isItemLoaded(_1f)){
_19[0]=_19[0].replace("dojoxGridRowTable","dojoxGridRowTable dojoxGridRowTableNeedsRowUpdate");
}else{
_19[_24]="<tr class=\""+_26+" dojoxGridNoChildren\" dojoxTreeGridPath=\""+_22.join("/")+"\">";
}
}
}else{
if(_1f&&!_20&&_21.length>1){
_19[_24]="<tr class=\""+_21[_21.length-2]+"\" dojoxTreeGridPath=\""+_22.join("/")+"\">";
}
}
}
};
_1d(0,_1a,false,["dojoxGridRowToggle-"+_18],[_18],true);
_19.push("</table>");
return _19.join("");
},findTarget:function(_37,_38){
var n=_37;
while(n&&(n!=this.domNode)){
if(n.tagName&&n.tagName.toLowerCase()=="tr"){
break;
}
n=n.parentNode;
}
return (n!=this.domNode)?n:null;
},getCellNode:function(_39,_3a){
var _3b=dojo.query("td[idx='"+_3a+"']",_39)[0];
if(_3b&&_3b.parentNode&&!dojo.hasClass(_3b.parentNode,"dojoxGridSummaryRow")){
return _3b;
}
},decorateEvent:function(e){
e.rowNode=this.findRowTarget(e.target);
if(!e.rowNode){
return false;
}
e.rowIndex=dojo.attr(e.rowNode,"dojoxTreeGridPath");
this.baseDecorateEvent(e);
e.cell=this.grid.getCell(e.cellIndex);
return true;
}});
dojo.declare("dojox.grid._TreeView",[dojox.grid._View],{_contentBuilderClass:dojox.grid._TreeContentBuilder,_onDndDrop:function(_3c,_3d,_3e){
if(this.grid&&this.grid.aggregator){
this.grid.aggregator.clearSubtotalCache();
}
this.inherited(arguments);
},postCreate:function(){
this.inherited(arguments);
this.connect(this.grid,"_cleanupExpandoCache","_cleanupExpandoCache");
},_cleanupExpandoCache:function(_3f,_40,_41){
if(_3f==-1){
return;
}
dojo.forEach(this.grid.layout.cells,function(_42){
if(typeof _42["openStates"]!="undefined"){
if(_40 in _42.openStates){
delete _42.openStates[_40];
}
}
});
if(typeof _3f=="string"&&_3f.indexOf("/")>-1){
var _43=new dojox.grid.TreePath(_3f,this.grid);
var _44=_43.parent();
while(_44){
_43=_44;
_44=_43.parent();
}
var _45=_43.item();
if(!_45){
return;
}
var _46=this.grid.store.getIdentity(_45);
if(typeof this._expandos[_46]!="undefined"){
for(var i in this._expandos[_46]){
var exp=this._expandos[_46][i];
if(exp){
exp.destroy();
}
delete this._expandos[_46][i];
}
delete this._expandos[_46];
}
}else{
for(var i in this._expandos){
if(typeof this._expandos[i]!="undefined"){
for(var j in this._expandos[i]){
var exp=this._expandos[i][j];
if(exp){
exp.destroy();
}
}
}
}
this._expandos={};
}
},postMixInProperties:function(){
this.inherited(arguments);
this._expandos={};
},onBeforeRow:function(_47,_48){
var g=this.grid;
if(g._by_idx&&g._by_idx[_47]&&g._by_idx[_47].idty){
var _49=g._by_idx[_47].idty;
this._expandos[_49]=this._expandos[_49]||{};
}
this.inherited(arguments);
},onAfterRow:function(_4a,_4b,_4c){
dojo.forEach(dojo.query("span.dojoxGridExpando",_4c),function(n){
if(n&&n.parentNode){
var tc=n.getAttribute("toggleClass");
var _4d;
var _4e;
var g=this.grid;
if(g._by_idx&&g._by_idx[_4a]&&g._by_idx[_4a].idty){
_4d=g._by_idx[_4a].idty;
_4e=this._expandos[_4d][tc];
}
if(_4e){
dojo.place(_4e.domNode,n,"replace");
_4e.itemId=n.getAttribute("itemId");
_4e.cellIdx=parseInt(n.getAttribute("cellIdx"),10);
if(isNaN(_4e.cellIdx)){
_4e.cellIdx=-1;
}
}else{
_4e=dojo.parser.parse(n.parentNode)[0];
if(_4d){
this._expandos[_4d][tc]=_4e;
}
}
if(!_4e.setRowNode(_4a,_4c,this)){
_4e.domNode.parentNode.removeChild(_4e.domNode);
}
}
},this);
var alt=false;
var _4f=this;
dojo.query("tr[dojoxTreeGridPath]",_4c).forEach(function(n){
dojo.toggleClass(n,"dojoxGridSubRowAlt",alt);
dojo.attr(n,"dojoxTreeGridBaseClasses",n.className);
alt=!alt;
_4f.grid.rows.styleRowNode(dojo.attr(n,"dojoxTreeGridPath"),n);
});
this.inherited(arguments);
},updateRowStyles:function(_50){
var _51=dojo.query("tr[dojoxTreeGridPath='"+_50+"']",this.domNode);
if(_51.length){
this.styleRowNode(_50,_51[0]);
}
},getCellNode:function(_52,_53){
var row=dojo.query("tr[dojoxTreeGridPath='"+_52+"']",this.domNode)[0];
if(row){
return this.content.getCellNode(row,_53);
}
}});
}
