/*
	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
*/

/*
	This is a compiled version of Dojo, built for deployment and not for
	development. To get an editable version, please visit:

		http://dojotoolkit.org

	for documentation and information on getting the source.
*/

if(!dojo._hasResource["dijit._base.manager"]){dojo._hasResource["dijit._base.manager"]=true;dojo.provide("dijit._base.manager");dojo.declare("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_1){if(this._hash[_1.id]){throw new Error("Tried to register widget with id=="+_1.id+" but that id is already registered");}this._hash[_1.id]=_1;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(_2,_3){_3=_3||dojo.global;var i=0,id;for(id in this._hash){_2.call(_3,this._hash[id],i++,this._hash);}return this;},filter:function(_4,_5){_5=_5||dojo.global;var _6=new dijit.WidgetSet(),i=0,id;for(id in this._hash){var w=this._hash[id];if(_4.call(_5,w,i++,this._hash)){_6.add(w);}}return _6;},byId:function(id){return this._hash[id];},byClass:function(_7){var _8=new dijit.WidgetSet(),id,_9;for(id in this._hash){_9=this._hash[id];if(_9.declaredClass==_7){_8.add(_9);}}return _8;},toArray:function(){var ar=[];for(var id in this._hash){ar.push(this._hash[id]);}return ar;},map:function(_a,_b){return dojo.map(this.toArray(),_a,_b);},every:function(_c,_d){_d=_d||dojo.global;var x=0,i;for(i in this._hash){if(!_c.call(_d,this._hash[i],x++,this._hash)){return false;}}return true;},some:function(_e,_f){_f=_f||dojo.global;var x=0,i;for(i in this._hash){if(_e.call(_f,this._hash[i],x++,this._hash)){return true;}}return false;}});dijit.registry=new dijit.WidgetSet();dijit._widgetTypeCtr={};dijit.getUniqueId=function(_10){var id;do{id=_10+"_"+(_10 in dijit._widgetTypeCtr?++dijit._widgetTypeCtr[_10]:dijit._widgetTypeCtr[_10]=0);}while(dijit.byId(id));return dijit._scopeName=="dijit"?id:dijit._scopeName+"_"+id;};dijit.findWidgets=function(_11){var _12=[];function _13(_14){for(var _15=_14.firstChild;_15;_15=_15.nextSibling){if(_15.nodeType==1){var _16=_15.getAttribute("widgetId");if(_16){var _17=dijit.byId(_16);_12.push(_17);}else{_13(_15);}}}};_13(_11);return _12;};dijit._destroyAll=function(){dijit._curFocus=null;dijit._prevFocus=null;dijit._activeStack=[];dojo.forEach(dijit.findWidgets(dojo.body()),function(_18){if(!_18._destroyed){if(_18.destroyRecursive){_18.destroyRecursive();}else{if(_18.destroy){_18.destroy();}}}});};if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit._destroyAll();});}dijit.byId=function(id){return typeof id=="string"?dijit.registry._hash[id]:id;};dijit.byNode=function(_19){return dijit.registry.byId(_19.getAttribute("widgetId"));};dijit.getEnclosingWidget=function(_1a){while(_1a){var id=_1a.getAttribute&&_1a.getAttribute("widgetId");if(id){return dijit.byId(id);}_1a=_1a.parentNode;}return null;};dijit._isElementShown=function(_1b){var _1c=dojo.style(_1b);return (_1c.visibility!="hidden")&&(_1c.visibility!="collapsed")&&(_1c.display!="none")&&(dojo.attr(_1b,"type")!="hidden");};dijit.isTabNavigable=function(_1d){if(dojo.attr(_1d,"disabled")){return false;}else{if(dojo.hasAttr(_1d,"tabIndex")){return dojo.attr(_1d,"tabIndex")>=0;}else{switch(_1d.nodeName.toLowerCase()){case "a":return dojo.hasAttr(_1d,"href");case "area":case "button":case "input":case "object":case "select":case "textarea":return true;case "iframe":if(dojo.isMoz){return _1d.contentDocument.designMode=="on";}else{if(dojo.isWebKit){var doc=_1d.contentDocument,_1e=doc&&doc.body;return _1e&&_1e.contentEditable=="true";}else{try{doc=_1d.contentWindow.document;_1e=doc&&doc.body;return _1e&&_1e.firstChild&&_1e.firstChild.contentEditable=="true";}catch(e){return false;}}}default:return _1d.contentEditable=="true";}}}};dijit._getTabNavigable=function(_1f){var _20,_21,_22,_23,_24,_25;var _26=function(_27){dojo.query("> *",_27).forEach(function(_28){var _29=dijit._isElementShown(_28);if(_29&&dijit.isTabNavigable(_28)){var _2a=dojo.attr(_28,"tabIndex");if(!dojo.hasAttr(_28,"tabIndex")||_2a==0){if(!_20){_20=_28;}_21=_28;}else{if(_2a>0){if(!_22||_2a<_23){_23=_2a;_22=_28;}if(!_24||_2a>=_25){_25=_2a;_24=_28;}}}}if(_29&&_28.nodeName.toUpperCase()!="SELECT"){_26(_28);}});};if(dijit._isElementShown(_1f)){_26(_1f);}return {first:_20,last:_21,lowest:_22,highest:_24};};dijit.getFirstInTabbingOrder=function(_2b){var _2c=dijit._getTabNavigable(dojo.byId(_2b));return _2c.lowest?_2c.lowest:_2c.first;};dijit.getLastInTabbingOrder=function(_2d){var _2e=dijit._getTabNavigable(dojo.byId(_2d));return _2e.last?_2e.last:_2e.highest;};dijit.defaultDuration=dojo.config["defaultDuration"]||200;}if(!dojo._hasResource["dijit._base.focus"]){dojo._hasResource["dijit._base.focus"]=true;dojo.provide("dijit._base.focus");dojo.mixin(dijit,{_curFocus:null,_prevFocus:null,isCollapsed:function(){return dijit.getBookmark().isCollapsed;},getBookmark:function(){var bm,rg,tg,sel=dojo.doc.selection,cf=dijit._curFocus;if(dojo.global.getSelection){sel=dojo.global.getSelection();if(sel){if(sel.isCollapsed){tg=cf?cf.tagName:"";if(tg){tg=tg.toLowerCase();if(tg=="textarea"||(tg=="input"&&(!cf.type||cf.type.toLowerCase()=="text"))){sel={start:cf.selectionStart,end:cf.selectionEnd,node:cf,pRange:true};return {isCollapsed:(sel.end<=sel.start),mark:sel};}}bm={isCollapsed:true};}else{rg=sel.getRangeAt(0);bm={isCollapsed:false,mark:rg.cloneRange()};}}}else{if(sel){tg=cf?cf.tagName:"";tg=tg.toLowerCase();if(cf&&tg&&(tg=="button"||tg=="textarea"||tg=="input")){if(sel.type&&sel.type.toLowerCase()=="none"){return {isCollapsed:true,mark:null};}else{rg=sel.createRange();return {isCollapsed:rg.text&&rg.text.length?false:true,mark:{range:rg,pRange:true}};}}bm={};try{rg=sel.createRange();bm.isCollapsed=!(sel.type=="Text"?rg.htmlText.length:rg.length);}catch(e){bm.isCollapsed=true;return bm;}if(sel.type.toUpperCase()=="CONTROL"){if(rg.length){bm.mark=[];var i=0,len=rg.length;while(i<len){bm.mark.push(rg.item(i++));}}else{bm.isCollapsed=true;bm.mark=null;}}else{bm.mark=rg.getBookmark();}}else{console.warn("No idea how to store the current selection for this browser!");}}return bm;},moveToBookmark:function(_2f){var _30=dojo.doc,_31=_2f.mark;if(_31){if(dojo.global.getSelection){var sel=dojo.global.getSelection();if(sel&&sel.removeAllRanges){if(_31.pRange){var r=_31;var n=r.node;n.selectionStart=r.start;n.selectionEnd=r.end;}else{sel.removeAllRanges();sel.addRange(_31);}}else{console.warn("No idea how to restore selection for this browser!");}}else{if(_30.selection&&_31){var rg;if(_31.pRange){rg=_31.range;}else{if(dojo.isArray(_31)){rg=_30.body.createControlRange();dojo.forEach(_31,function(n){rg.addElement(n);});}else{rg=_30.body.createTextRange();rg.moveToBookmark(_31);}}rg.select();}}}},getFocus:function(_32,_33){var _34=!dijit._curFocus||(_32&&dojo.isDescendant(dijit._curFocus,_32.domNode))?dijit._prevFocus:dijit._curFocus;return {node:_34,bookmark:(_34==dijit._curFocus)&&dojo.withGlobal(_33||dojo.global,dijit.getBookmark),openedForWindow:_33};},focus:function(_35){if(!_35){return;}var _36="node" in _35?_35.node:_35,_37=_35.bookmark,_38=_35.openedForWindow,_39=_37?_37.isCollapsed:false;if(_36){var _3a=(_36.tagName.toLowerCase()=="iframe")?_36.contentWindow:_36;if(_3a&&_3a.focus){try{_3a.focus();}catch(e){}}dijit._onFocusNode(_36);}if(_37&&dojo.withGlobal(_38||dojo.global,dijit.isCollapsed)&&!_39){if(_38){_38.focus();}try{dojo.withGlobal(_38||dojo.global,dijit.moveToBookmark,null,[_37]);}catch(e2){}}},_activeStack:[],registerIframe:function(_3b){return dijit.registerWin(_3b.contentWindow,_3b);},unregisterIframe:function(_3c){dijit.unregisterWin(_3c);},registerWin:function(_3d,_3e){var _3f=function(evt){dijit._justMouseDowned=true;setTimeout(function(){dijit._justMouseDowned=false;},0);dijit._onTouchNode(_3e||evt.target||evt.srcElement,"mouse");};var doc=dojo.isIE?_3d.document.documentElement:_3d.document;if(doc){if(dojo.isIE){doc.attachEvent("onmousedown",_3f);var _40=function(evt){if(evt.srcElement.tagName.toLowerCase()!="#document"&&dijit.isTabNavigable(evt.srcElement)){dijit._onFocusNode(_3e||evt.srcElement);}else{dijit._onTouchNode(_3e||evt.srcElement);}};doc.attachEvent("onactivate",_40);var _41=function(evt){dijit._onBlurNode(_3e||evt.srcElement);};doc.attachEvent("ondeactivate",_41);return function(){doc.detachEvent("onmousedown",_3f);doc.detachEvent("onactivate",_40);doc.detachEvent("ondeactivate",_41);doc=null;};}else{doc.addEventListener("mousedown",_3f,true);var _42=function(evt){dijit._onFocusNode(_3e||evt.target);};doc.addEventListener("focus",_42,true);var _43=function(evt){dijit._onBlurNode(_3e||evt.target);};doc.addEventListener("blur",_43,true);return function(){doc.removeEventListener("mousedown",_3f,true);doc.removeEventListener("focus",_42,true);doc.removeEventListener("blur",_43,true);doc=null;};}}},unregisterWin:function(_44){_44&&_44();},_onBlurNode:function(_45){dijit._prevFocus=dijit._curFocus;dijit._curFocus=null;if(dijit._justMouseDowned){return;}if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);}dijit._clearActiveWidgetsTimer=setTimeout(function(){delete dijit._clearActiveWidgetsTimer;dijit._setStack([]);dijit._prevFocus=null;},100);},_onTouchNode:function(_46,by){if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);delete dijit._clearActiveWidgetsTimer;}var _47=[];try{while(_46){var _48=dojo.attr(_46,"dijitPopupParent");if(_48){_46=dijit.byId(_48).domNode;}else{if(_46.tagName&&_46.tagName.toLowerCase()=="body"){if(_46===dojo.body()){break;}_46=dijit.getDocumentWindow(_46.ownerDocument).frameElement;}else{var id=_46.getAttribute&&_46.getAttribute("widgetId");if(id){_47.unshift(id);}_46=_46.parentNode;}}}}catch(e){}dijit._setStack(_47,by);},_onFocusNode:function(_49){if(!_49){return;}if(_49.nodeType==9){return;}dijit._onTouchNode(_49);if(_49==dijit._curFocus){return;}if(dijit._curFocus){dijit._prevFocus=dijit._curFocus;}dijit._curFocus=_49;dojo.publish("focusNode",[_49]);},_setStack:function(_4a,by){var _4b=dijit._activeStack;dijit._activeStack=_4a;for(var _4c=0;_4c<Math.min(_4b.length,_4a.length);_4c++){if(_4b[_4c]!=_4a[_4c]){break;}}var _4d;for(var i=_4b.length-1;i>=_4c;i--){_4d=dijit.byId(_4b[i]);if(_4d){_4d._focused=false;_4d._hasBeenBlurred=true;if(_4d._onBlur){_4d._onBlur(by);}if(_4d._setStateClass){_4d._setStateClass();}dojo.publish("widgetBlur",[_4d,by]);}}for(i=_4c;i<_4a.length;i++){_4d=dijit.byId(_4a[i]);if(_4d){_4d._focused=true;if(_4d._onFocus){_4d._onFocus(by);}if(_4d._setStateClass){_4d._setStateClass();}dojo.publish("widgetFocus",[_4d,by]);}}}});dojo.addOnLoad(function(){var _4e=dijit.registerWin(window);if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit.unregisterWin(_4e);_4e=null;});}});}if(!dojo._hasResource["dojo.AdapterRegistry"]){dojo._hasResource["dojo.AdapterRegistry"]=true;dojo.provide("dojo.AdapterRegistry");dojo.AdapterRegistry=function(_4f){this.pairs=[];this.returnWrappers=_4f||false;};dojo.extend(dojo.AdapterRegistry,{register:function(_50,_51,_52,_53,_54){this.pairs[((_54)?"unshift":"push")]([_50,_51,_52,_53]);},match:function(){for(var i=0;i<this.pairs.length;i++){var _55=this.pairs[i];if(_55[1].apply(this,arguments)){if((_55[3])||(this.returnWrappers)){return _55[2];}else{return _55[2].apply(this,arguments);}}}throw new Error("No match found");},unregister:function(_56){for(var i=0;i<this.pairs.length;i++){var _57=this.pairs[i];if(_57[0]==_56){this.pairs.splice(i,1);return true;}}return false;}});}if(!dojo._hasResource["dijit._base.place"]){dojo._hasResource["dijit._base.place"]=true;dojo.provide("dijit._base.place");dijit.getViewport=function(){var _58=(dojo.doc.compatMode=="BackCompat")?dojo.body():dojo.doc.documentElement;var _59=dojo._docScroll();return {w:_58.clientWidth,h:_58.clientHeight,l:_59.x,t:_59.y};};dijit.placeOnScreen=function(_5a,pos,_5b,_5c){var _5d=dojo.map(_5b,function(_5e){var c={corner:_5e,pos:{x:pos.x,y:pos.y}};if(_5c){c.pos.x+=_5e.charAt(1)=="L"?_5c.x:-_5c.x;c.pos.y+=_5e.charAt(0)=="T"?_5c.y:-_5c.y;}return c;});return dijit._place(_5a,_5d);};dijit._place=function(_5f,_60,_61){var _62=dijit.getViewport();if(!_5f.parentNode||String(_5f.parentNode.tagName).toLowerCase()!="body"){dojo.body().appendChild(_5f);}var _63=null;dojo.some(_60,function(_64){var _65=_64.corner;var pos=_64.pos;if(_61){_61(_5f,_64.aroundCorner,_65);}var _66=_5f.style;var _67=_66.display;var _68=_66.visibility;_66.visibility="hidden";_66.display="";var mb=dojo.marginBox(_5f);_66.display=_67;_66.visibility=_68;var _69=Math.max(_62.l,_65.charAt(1)=="L"?pos.x:(pos.x-mb.w)),_6a=Math.max(_62.t,_65.charAt(0)=="T"?pos.y:(pos.y-mb.h)),_6b=Math.min(_62.l+_62.w,_65.charAt(1)=="L"?(_69+mb.w):pos.x),_6c=Math.min(_62.t+_62.h,_65.charAt(0)=="T"?(_6a+mb.h):pos.y),_6d=_6b-_69,_6e=_6c-_6a,_6f=(mb.w-_6d)+(mb.h-_6e);if(_63==null||_6f<_63.overflow){_63={corner:_65,aroundCorner:_64.aroundCorner,x:_69,y:_6a,w:_6d,h:_6e,overflow:_6f};}return !_6f;});_5f.style.left=_63.x+"px";_5f.style.top=_63.y+"px";if(_63.overflow&&_61){_61(_5f,_63.aroundCorner,_63.corner);}return _63;};dijit.placeOnScreenAroundNode=function(_70,_71,_72,_73){_71=dojo.byId(_71);var _74=_71.style.display;_71.style.display="";var _75=dojo.position(_71,true);_71.style.display=_74;return dijit._placeOnScreenAroundRect(_70,_75.x,_75.y,_75.w,_75.h,_72,_73);};dijit.placeOnScreenAroundRectangle=function(_76,_77,_78,_79){return dijit._placeOnScreenAroundRect(_76,_77.x,_77.y,_77.width,_77.height,_78,_79);};dijit._placeOnScreenAroundRect=function(_7a,x,y,_7b,_7c,_7d,_7e){var _7f=[];for(var _80 in _7d){_7f.push({aroundCorner:_80,corner:_7d[_80],pos:{x:x+(_80.charAt(1)=="L"?0:_7b),y:y+(_80.charAt(0)=="T"?0:_7c)}});}return dijit._place(_7a,_7f,_7e);};dijit.placementRegistry=new dojo.AdapterRegistry();dijit.placementRegistry.register("node",function(n,x){return typeof x=="object"&&typeof x.offsetWidth!="undefined"&&typeof x.offsetHeight!="undefined";},dijit.placeOnScreenAroundNode);dijit.placementRegistry.register("rect",function(n,x){return typeof x=="object"&&"x" in x&&"y" in x&&"width" in x&&"height" in x;},dijit.placeOnScreenAroundRectangle);dijit.placeOnScreenAroundElement=function(_81,_82,_83,_84){return dijit.placementRegistry.match.apply(dijit.placementRegistry,arguments);};dijit.getPopupAlignment=function(_85,_86){var _87={};dojo.forEach(_85,function(pos){switch(pos){case "after":_87[_86?"BR":"BL"]=_86?"BL":"BR";break;case "before":_87[_86?"BL":"BR"]=_86?"BR":"BL";break;case "below":_87[_86?"BL":"BR"]=_86?"TL":"TR";_87[_86?"BR":"BL"]=_86?"TR":"TL";break;case "above":default:_87[_86?"TL":"TR"]=_86?"BL":"BR";_87[_86?"TR":"TL"]=_86?"BR":"BL";break;}});return _87;};dijit.getPopupAroundAlignment=function(_88,_89){var _8a={};dojo.forEach(_88,function(pos){switch(pos){case "after":_8a[_89?"BR":"BL"]=_89?"BL":"BR";break;case "before":_8a[_89?"BL":"BR"]=_89?"BR":"BL";break;case "below":_8a[_89?"BL":"BR"]=_89?"TL":"TR";_8a[_89?"BR":"BL"]=_89?"TR":"TL";break;case "above":default:_8a[_89?"TL":"TR"]=_89?"BL":"BR";_8a[_89?"TR":"TL"]=_89?"BR":"BL";break;}});return _8a;};}if(!dojo._hasResource["dijit._base.window"]){dojo._hasResource["dijit._base.window"]=true;dojo.provide("dijit._base.window");dijit.getDocumentWindow=function(doc){if(dojo.isIE&&window!==document.parentWindow&&!doc._parentWindow){doc.parentWindow.execScript("document._parentWindow = window;","Javascript");var win=doc._parentWindow;doc._parentWindow=null;return win;}return doc._parentWindow||doc.parentWindow||doc.defaultView;};}if(!dojo._hasResource["dijit._base.popup"]){dojo._hasResource["dijit._base.popup"]=true;dojo.provide("dijit._base.popup");dijit.popup=new function(){var _8b=[],_8c=1000,_8d=1;this.moveOffScreen=function(_8e){var s=_8e.style;s.visibility="hidden";s.position="absolute";s.top="-9999px";if(s.display=="none"){s.display="";}dojo.body().appendChild(_8e);};var _8f=function(){for(var pi=_8b.length-1;pi>0&&_8b[pi].parent===_8b[pi-1].widget;pi--){}return _8b[pi];};var _90=[];this.open=function(_91){var _92=_91.popup,_93=_91.orient||(dojo._isBodyLtr()?{"BL":"TL","BR":"TR","TL":"BL","TR":"BR"}:{"BR":"TR","BL":"TL","TR":"BR","TL":"BL"}),_94=_91.around,id=(_91.around&&_91.around.id)?(_91.around.id+"_dropdown"):("popup_"+_8d++);var _95=_90.pop(),_96,_97;if(!_95){_96=dojo.create("div",{"class":"dijitPopup"},dojo.body());dijit.setWaiRole(_96,"presentation");}else{_96=_95[0];_97=_95[1];}dojo.attr(_96,{id:id,style:{zIndex:_8c+_8b.length,visibility:"hidden",top:"-9999px"},dijitPopupParent:_91.parent?_91.parent.id:""});var s=_92.domNode.style;s.display="";s.visibility="";s.position="";s.top="0px";_96.appendChild(_92.domNode);if(!_97){_97=new dijit.BackgroundIframe(_96);}else{_97.resize(_96);}var _98=_94?dijit.placeOnScreenAroundElement(_96,_94,_93,_92.orient?dojo.hitch(_92,"orient"):null):dijit.placeOnScreen(_96,_91,_93=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],_91.padding);_96.style.visibility="visible";var _99=[];_99.push(dojo.connect(_96,"onkeypress",this,function(evt){if(evt.charOrCode==dojo.keys.ESCAPE&&_91.onCancel){dojo.stopEvent(evt);_91.onCancel();}else{if(evt.charOrCode===dojo.keys.TAB){dojo.stopEvent(evt);var _9a=_8f();if(_9a&&_9a.onCancel){_9a.onCancel();}}}}));if(_92.onCancel){_99.push(dojo.connect(_92,"onCancel",_91.onCancel));}_99.push(dojo.connect(_92,_92.onExecute?"onExecute":"onChange",function(){var _9b=_8f();if(_9b&&_9b.onExecute){_9b.onExecute();}}));_8b.push({wrapper:_96,iframe:_97,widget:_92,parent:_91.parent,onExecute:_91.onExecute,onCancel:_91.onCancel,onClose:_91.onClose,handlers:_99});if(_92.onOpen){_92.onOpen(_98);}return _98;};this.close=function(_9c){while(dojo.some(_8b,function(_9d){return _9d.widget==_9c;})){var top=_8b.pop(),_9e=top.wrapper,_9f=top.iframe,_a0=top.widget,_a1=top.onClose;if(_a0.onClose){_a0.onClose();}dojo.forEach(top.handlers,dojo.disconnect);if(_a0&&_a0.domNode){this.moveOffScreen(_a0.domNode);}_9e.style.top="-9999px";_9e.style.visibility="hidden";_90.push([_9e,_9f]);if(_a1){_a1();}}};}();dijit._frames=new function(){var _a2=[];this.pop=function(){var _a3;if(_a2.length){_a3=_a2.pop();_a3.style.display="";}else{if(dojo.isIE){var _a4=dojo.config["dojoBlankHtmlUrl"]||(dojo.moduleUrl("dojo","resources/blank.html")+"")||"javascript:\"\"";var _a5="<iframe src='"+_a4+"'"+" style='position: absolute; left: 0px; top: 0px;"+"z-index: -1; filter:Alpha(Opacity=\"0\");'>";_a3=dojo.doc.createElement(_a5);}else{_a3=dojo.create("iframe");_a3.src="javascript:\"\"";_a3.className="dijitBackgroundIframe";dojo.style(_a3,"opacity",0.1);}_a3.tabIndex=-1;}return _a3;};this.push=function(_a6){_a6.style.display="none";_a2.push(_a6);};}();dijit.BackgroundIframe=function(_a7){if(!_a7.id){throw new Error("no id");}if(dojo.isIE||dojo.isMoz){var _a8=dijit._frames.pop();_a7.appendChild(_a8);if(dojo.isIE<7){this.resize(_a7);this._conn=dojo.connect(_a7,"onresize",this,function(){this.resize(_a7);});}else{dojo.style(_a8,{width:"100%",height:"100%"});}this.iframe=_a8;}};dojo.extend(dijit.BackgroundIframe,{resize:function(_a9){if(this.iframe&&dojo.isIE<7){dojo.style(this.iframe,{width:_a9.offsetWidth+"px",height:_a9.offsetHeight+"px"});}},destroy:function(){if(this._conn){dojo.disconnect(this._conn);this._conn=null;}if(this.iframe){dijit._frames.push(this.iframe);delete this.iframe;}}});}if(!dojo._hasResource["dijit._base.scroll"]){dojo._hasResource["dijit._base.scroll"]=true;dojo.provide("dijit._base.scroll");dijit.scrollIntoView=function(_aa,pos){try{_aa=dojo.byId(_aa);var doc=_aa.ownerDocument||dojo.doc,_ab=doc.body||dojo.body(),_ac=doc.documentElement||_ab.parentNode,_ad=dojo.isIE,_ae=dojo.isWebKit;if((!(dojo.isMoz||_ad||_ae)||_aa==_ab||_aa==_ac)&&(typeof _aa.scrollIntoView!="undefined")){_aa.scrollIntoView(false);return;}var _af=doc.compatMode=="BackCompat",_b0=_af?_ab:_ac,_b1=_ae?_ab:_b0,_b2=_b0.clientWidth,_b3=_b0.clientHeight,rtl=!dojo._isBodyLtr(),_b4=pos||dojo.position(_aa),el=_aa.parentNode,_b5=function(el){return ((_ad<=6||(_ad&&_af))?false:(dojo.style(el,"position").toLowerCase()=="fixed"));};if(_b5(_aa)){return;}while(el){if(el==_ab){el=_b1;}var _b6=dojo.position(el),_b7=_b5(el);with(_b6){if(el==_b1){w=_b2,h=_b3;if(_b1==_ac&&_ad&&rtl){x+=_b1.offsetWidth-w;}if(x<0||!_ad){x=0;}if(y<0||!_ad){y=0;}}else{var pb=dojo._getPadBorderExtents(el);w-=pb.w;h-=pb.h;x+=pb.l;y+=pb.t;}with(el){if(el!=_b1){var _b8=clientWidth,_b9=w-_b8;if(_b8>0&&_b9>0){w=_b8;if(_ad&&rtl){x+=_b9;}}_b8=clientHeight;_b9=h-_b8;if(_b8>0&&_b9>0){h=_b8;}}if(_b7){if(y<0){h+=y,y=0;}if(x<0){w+=x,x=0;}if(y+h>_b3){h=_b3-y;}if(x+w>_b2){w=_b2-x;}}var l=_b4.x-x,t=_b4.y-Math.max(y,0),r=l+_b4.w-w,bot=t+_b4.h-h;if(r*l>0){var s=Math[l<0?"max":"min"](l,r);_b4.x+=scrollLeft;scrollLeft+=(_ad>=8&&!_af&&rtl)?-s:s;_b4.x-=scrollLeft;}if(bot*t>0){_b4.y+=scrollTop;scrollTop+=Math[t<0?"max":"min"](t,bot);_b4.y-=scrollTop;}}}el=(el!=_b1)&&!_b7&&el.parentNode;}}catch(error){console.error("scrollIntoView: "+error);_aa.scrollIntoView(false);}};}if(!dojo._hasResource["dijit._base.sniff"]){dojo._hasResource["dijit._base.sniff"]=true;dojo.provide("dijit._base.sniff");(function(){var d=dojo,_ba=d.doc.documentElement,ie=d.isIE,_bb=d.isOpera,maj=Math.floor,ff=d.isFF,_bc=d.boxModel.replace(/-/,""),_bd={dj_ie:ie,dj_ie6:maj(ie)==6,dj_ie7:maj(ie)==7,dj_ie8:maj(ie)==8,dj_iequirks:ie&&d.isQuirks,dj_opera:_bb,dj_khtml:d.isKhtml,dj_webkit:d.isWebKit,dj_safari:d.isSafari,dj_chrome:d.isChrome,dj_gecko:d.isMozilla,dj_ff3:maj(ff)==3};_bd["dj_"+_bc]=true;for(var p in _bd){if(_bd[p]){if(_ba.className){_ba.className+=" "+p;}else{_ba.className=p;}}}dojo._loaders.unshift(function(){if(!dojo._isBodyLtr()){_ba.className+=" dijitRtl";for(var p in _bd){if(_bd[p]){_ba.className+=" "+p+"-rtl";}}}});})();}if(!dojo._hasResource["dijit._base.typematic"]){dojo._hasResource["dijit._base.typematic"]=true;dojo.provide("dijit._base.typematic");dijit.typematic={_fireEventAndReload:function(){this._timer=null;this._callback(++this._count,this._node,this._evt);this._currentTimeout=Math.max(this._currentTimeout<0?this._initialDelay:(this._subsequentDelay>1?this._subsequentDelay:Math.round(this._currentTimeout*this._subsequentDelay)),10);this._timer=setTimeout(dojo.hitch(this,"_fireEventAndReload"),this._currentTimeout);},trigger:function(evt,_be,_bf,_c0,obj,_c1,_c2){if(obj!=this._obj){this.stop();this._initialDelay=_c2||500;this._subsequentDelay=_c1||0.9;this._obj=obj;this._evt=evt;this._node=_bf;this._currentTimeout=-1;this._count=-1;this._callback=dojo.hitch(_be,_c0);this._fireEventAndReload();}},stop:function(){if(this._timer){clearTimeout(this._timer);this._timer=null;}if(this._obj){this._callback(-1,this._node,this._evt);this._obj=null;}},addKeyListener:function(_c3,_c4,_c5,_c6,_c7,_c8){if(_c4.keyCode){_c4.charOrCode=_c4.keyCode;dojo.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}else{if(_c4.charCode){_c4.charOrCode=String.fromCharCode(_c4.charCode);dojo.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}}return [dojo.connect(_c3,"onkeypress",this,function(evt){if(evt.charOrCode==_c4.charOrCode&&(_c4.ctrlKey===undefined||_c4.ctrlKey==evt.ctrlKey)&&(_c4.altKey===undefined||_c4.altKey==evt.altKey)&&(_c4.metaKey===undefined||_c4.metaKey==(evt.metaKey||false))&&(_c4.shiftKey===undefined||_c4.shiftKey==evt.shiftKey)){dojo.stopEvent(evt);dijit.typematic.trigger(_c4,_c5,_c3,_c6,_c4,_c7,_c8);}else{if(dijit.typematic._obj==_c4){dijit.typematic.stop();}}}),dojo.connect(_c3,"onkeyup",this,function(evt){if(dijit.typematic._obj==_c4){dijit.typematic.stop();}})];},addMouseListener:function(_c9,_ca,_cb,_cc,_cd){var dc=dojo.connect;return [dc(_c9,"mousedown",this,function(evt){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_ca,_c9,_cb,_c9,_cc,_cd);}),dc(_c9,"mouseup",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(_c9,"mouseout",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(_c9,"mousemove",this,function(evt){dojo.stopEvent(evt);}),dc(_c9,"dblclick",this,function(evt){dojo.stopEvent(evt);if(dojo.isIE){dijit.typematic.trigger(evt,_ca,_c9,_cb,_c9,_cc,_cd);setTimeout(dojo.hitch(this,dijit.typematic.stop),50);}})];},addListener:function(_ce,_cf,_d0,_d1,_d2,_d3,_d4){return this.addKeyListener(_cf,_d0,_d1,_d2,_d3,_d4).concat(this.addMouseListener(_ce,_d1,_d2,_d3,_d4));}};}if(!dojo._hasResource["dijit._base.wai"]){dojo._hasResource["dijit._base.wai"]=true;dojo.provide("dijit._base.wai");dijit.wai={onload:function(){var div=dojo.create("div",{id:"a11yTestNode",style:{cssText:"border: 1px solid;"+"border-color:red green;"+"position: absolute;"+"height: 5px;"+"top: -999px;"+"background-image: url(\""+(dojo.config.blankGif||dojo.moduleUrl("dojo","resources/blank.gif"))+"\");"}},dojo.body());var cs=dojo.getComputedStyle(div);if(cs){var _d5=cs.backgroundImage;var _d6=(cs.borderTopColor==cs.borderRightColor)||(_d5!=null&&(_d5=="none"||_d5=="url(invalid-url:)"));dojo[_d6?"addClass":"removeClass"](dojo.body(),"dijit_a11y");if(dojo.isIE){div.outerHTML="";}else{dojo.body().removeChild(div);}}}};if(dojo.isIE||dojo.isMoz){dojo._loaders.unshift(dijit.wai.onload);}dojo.mixin(dijit,{_XhtmlRoles:/banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,hasWaiRole:function(_d7,_d8){var _d9=this.getWaiRole(_d7);return _d8?(_d9.indexOf(_d8)>-1):(_d9.length>0);},getWaiRole:function(_da){return dojo.trim((dojo.attr(_da,"role")||"").replace(this._XhtmlRoles,"").replace("wairole:",""));},setWaiRole:function(_db,_dc){var _dd=dojo.attr(_db,"role")||"";if(!this._XhtmlRoles.test(_dd)){dojo.attr(_db,"role",_dc);}else{if((" "+_dd+" ").indexOf(" "+_dc+" ")<0){var _de=dojo.trim(_dd.replace(this._XhtmlRoles,""));var _df=dojo.trim(_dd.replace(_de,""));dojo.attr(_db,"role",_df+(_df?" ":"")+_dc);}}},removeWaiRole:function(_e0,_e1){var _e2=dojo.attr(_e0,"role");if(!_e2){return;}if(_e1){var t=dojo.trim((" "+_e2+" ").replace(" "+_e1+" "," "));dojo.attr(_e0,"role",t);}else{_e0.removeAttribute("role");}},hasWaiState:function(_e3,_e4){return _e3.hasAttribute?_e3.hasAttribute("aria-"+_e4):!!_e3.getAttribute("aria-"+_e4);},getWaiState:function(_e5,_e6){return _e5.getAttribute("aria-"+_e6)||"";},setWaiState:function(_e7,_e8,_e9){_e7.setAttribute("aria-"+_e8,_e9);},removeWaiState:function(_ea,_eb){_ea.removeAttribute("aria-"+_eb);}});}if(!dojo._hasResource["dijit._base"]){dojo._hasResource["dijit._base"]=true;dojo.provide("dijit._base");}if(!dojo._hasResource["dojo.date.stamp"]){dojo._hasResource["dojo.date.stamp"]=true;dojo.provide("dojo.date.stamp");dojo.date.stamp.fromISOString=function(_ec,_ed){if(!dojo.date.stamp._isoRegExp){dojo.date.stamp._isoRegExp=/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;}var _ee=dojo.date.stamp._isoRegExp.exec(_ec),_ef=null;if(_ee){_ee.shift();if(_ee[1]){_ee[1]--;}if(_ee[6]){_ee[6]*=1000;}if(_ed){_ed=new Date(_ed);dojo.map(["FullYear","Month","Date","Hours","Minutes","Seconds","Milliseconds"],function(_f0){return _ed["get"+_f0]();}).forEach(function(_f1,_f2){if(_ee[_f2]===undefined){_ee[_f2]=_f1;}});}_ef=new Date(_ee[0]||1970,_ee[1]||0,_ee[2]||1,_ee[3]||0,_ee[4]||0,_ee[5]||0,_ee[6]||0);if(_ee[0]<100){_ef.setFullYear(_ee[0]||1970);}var _f3=0,_f4=_ee[7]&&_ee[7].charAt(0);if(_f4!="Z"){_f3=((_ee[8]||0)*60)+(Number(_ee[9])||0);if(_f4!="-"){_f3*=-1;}}if(_f4){_f3-=_ef.getTimezoneOffset();}if(_f3){_ef.setTime(_ef.getTime()+_f3*60000);}}return _ef;};dojo.date.stamp.toISOString=function(_f5,_f6){var _f7=function(n){return (n<10)?"0"+n:n;};_f6=_f6||{};var _f8=[],_f9=_f6.zulu?"getUTC":"get",_fa="";if(_f6.selector!="time"){var _fb=_f5[_f9+"FullYear"]();_fa=["0000".substr((_fb+"").length)+_fb,_f7(_f5[_f9+"Month"]()+1),_f7(_f5[_f9+"Date"]())].join("-");}_f8.push(_fa);if(_f6.selector!="date"){var _fc=[_f7(_f5[_f9+"Hours"]()),_f7(_f5[_f9+"Minutes"]()),_f7(_f5[_f9+"Seconds"]())].join(":");var _fd=_f5[_f9+"Milliseconds"]();if(_f6.milliseconds){_fc+="."+(_fd<100?"0":"")+_f7(_fd);}if(_f6.zulu){_fc+="Z";}else{if(_f6.selector!="time"){var _fe=_f5.getTimezoneOffset();var _ff=Math.abs(_fe);_fc+=(_fe>0?"-":"+")+_f7(Math.floor(_ff/60))+":"+_f7(_ff%60);}}_f8.push(_fc);}return _f8.join("T");};}if(!dojo._hasResource["dojo.parser"]){dojo._hasResource["dojo.parser"]=true;dojo.provide("dojo.parser");dojo.parser=new function(){var d=dojo;this._attrName=d._scopeName+"Type";this._query="["+this._attrName+"]";function _100(_101){if(d.isString(_101)){return "string";}if(typeof _101=="number"){return "number";}if(typeof _101=="boolean"){return "boolean";}if(d.isFunction(_101)){return "function";}if(d.isArray(_101)){return "array";}if(_101 instanceof Date){return "date";}if(_101 instanceof d._Url){return "url";}return "object";};function _102(_103,type){switch(type){case "string":return _103;case "number":return _103.length?Number(_103):NaN;case "boolean":return typeof _103=="boolean"?_103:!(_103.toLowerCase()=="false");case "function":if(d.isFunction(_103)){_103=_103.toString();_103=d.trim(_103.substring(_103.indexOf("{")+1,_103.length-1));}try{if(_103.search(/[^\w\.]+/i)!=-1){return new Function(_103);}else{return d.getObject(_103,false);}}catch(e){return new Function();}case "array":return _103?_103.split(/\s*,\s*/):[];case "date":switch(_103){case "":return new Date("");case "now":return new Date();default:return d.date.stamp.fromISOString(_103);}case "url":return d.baseUrl+_103;default:return d.fromJson(_103);}};var _104={};dojo.connect(dojo,"extend",function(){_104={};});function _105(_106){if(!_104[_106]){var cls=d.getObject(_106);if(!d.isFunction(cls)){throw new Error("Could not load class '"+_106+"'. Did you spell the name correctly and use a full path, like 'dijit.form.Button'?");}var _107=cls.prototype;var _108={},_109={};for(var name in _107){if(name.charAt(0)=="_"){continue;}if(name in _109){continue;}var _10a=_107[name];_108[name]=_100(_10a);}_104[_106]={cls:cls,params:_108};}return _104[_106];};this._functionFromScript=function(_10b){var _10c="";var _10d="";var _10e=_10b.getAttribute("args");if(_10e){d.forEach(_10e.split(/\s*,\s*/),function(part,idx){_10c+="var "+part+" = arguments["+idx+"]; ";});}var _10f=_10b.getAttribute("with");if(_10f&&_10f.length){d.forEach(_10f.split(/\s*,\s*/),function(part){_10c+="with("+part+"){";_10d+="}";});}return new Function(_10c+_10b.innerHTML+_10d);};this.instantiate=function(_110,_111,args){var _112=[],dp=dojo.parser;_111=_111||{};args=args||{};d.forEach(_110,function(node){if(!node){return;}var type=dp._attrName in _111?_111[dp._attrName]:node.getAttribute(dp._attrName);if(!type||!type.length){return;}var _113=_105(type),_114=_113.cls,ps=_114._noScript||_114.prototype._noScript;var _115={},_116=node.attributes;for(var name in _113.params){var item=name in _111?{value:_111[name],specified:true}:_116.getNamedItem(name);if(!item||(!item.specified&&(!dojo.isIE||name.toLowerCase()!="value"))){continue;}var _117=item.value;switch(name){case "class":_117="className" in _111?_111.className:node.className;break;case "style":_117="style" in _111?_111.style:(node.style&&node.style.cssText);}var _118=_113.params[name];if(typeof _117=="string"){_115[name]=_102(_117,_118);}else{_115[name]=_117;}}if(!ps){var _119=[],_11a=[];d.query("> script[type^='dojo/']",node).orphan().forEach(function(_11b){var _11c=_11b.getAttribute("event"),type=_11b.getAttribute("type"),nf=d.parser._functionFromScript(_11b);if(_11c){if(type=="dojo/connect"){_119.push({event:_11c,func:nf});}else{_115[_11c]=nf;}}else{_11a.push(nf);}});}var _11d=_114.markupFactory||_114.prototype&&_114.prototype.markupFactory;var _11e=_11d?_11d(_115,node,_114):new _114(_115,node);_112.push(_11e);var _11f=node.getAttribute("jsId");if(_11f){d.setObject(_11f,_11e);}if(!ps){d.forEach(_119,function(_120){d.connect(_11e,_120.event,null,_120.func);});d.forEach(_11a,function(func){func.call(_11e);});}});if(!_111._started){d.forEach(_112,function(_121){if(!args.noStart&&_121&&_121.startup&&!_121._started&&(!_121.getParent||!_121.getParent())){_121.startup();}});}return _112;};this.parse=function(_122,args){var root;if(!args&&_122&&_122.rootNode){args=_122;root=args.rootNode;}else{root=_122;}var list=d.query(this._query,root);return this.instantiate(list,null,args);};}();(function(){var _123=function(){if(dojo.config.parseOnLoad){dojo.parser.parse();}};if(dojo.exists("dijit.wai.onload")&&(dijit.wai.onload===dojo._loaders[0])){dojo._loaders.splice(1,0,_123);}else{dojo._loaders.unshift(_123);}})();}if(!dojo._hasResource["dijit._Widget"]){dojo._hasResource["dijit._Widget"]=true;dojo.provide("dijit._Widget");dojo.require("dijit._base");dojo.connect(dojo,"_connect",function(_124,_125){if(_124&&dojo.isFunction(_124._onConnect)){_124._onConnect(_125);}});dijit._connectOnUseEventHandler=function(_126){};dijit._lastKeyDownNode=null;if(dojo.isIE){(function(){var _127=function(evt){dijit._lastKeyDownNode=evt.srcElement;};dojo.doc.attachEvent("onkeydown",_127);dojo.addOnWindowUnload(function(){dojo.doc.detachEvent("onkeydown",_127);});})();}else{dojo.doc.addEventListener("keydown",function(evt){dijit._lastKeyDownNode=evt.target;},true);}(function(){var _128={},_129=function(_12a){var dc=_12a.declaredClass;if(!_128[dc]){var r=[],_12b,_12c=_12a.constructor.prototype;for(var _12d in _12c){if(dojo.isFunction(_12c[_12d])&&(_12b=_12d.match(/^_set([a-zA-Z]*)Attr$/))&&_12b[1]){r.push(_12b[1].charAt(0).toLowerCase()+_12b[1].substr(1));}}_128[dc]=r;}return _128[dc]||[];};dojo.declare("dijit._Widget",null,{id:"",lang:"",dir:"","class":"",style:"",title:"",tooltip:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{id:"",dir:"",lang:"","class":"",style:"",title:""},_deferredConnects:{onClick:"",onDblClick:"",onKeyDown:"",onKeyPress:"",onKeyUp:"",onMouseMove:"",onMouseDown:"",onMouseOut:"",onMouseOver:"",onMouseLeave:"",onMouseEnter:"",onMouseUp:""},onClick:dijit._connectOnUseEventHandler,onDblClick:dijit._connectOnUseEventHandler,onKeyDown:dijit._connectOnUseEventHandler,onKeyPress:dijit._connectOnUseEventHandler,onKeyUp:dijit._connectOnUseEventHandler,onMouseDown:dijit._connectOnUseEventHandler,onMouseMove:dijit._connectOnUseEventHandler,onMouseOut:dijit._connectOnUseEventHandler,onMouseOver:dijit._connectOnUseEventHandler,onMouseLeave:dijit._connectOnUseEventHandler,onMouseEnter:dijit._connectOnUseEventHandler,onMouseUp:dijit._connectOnUseEventHandler,_blankGif:(dojo.config.blankGif||dojo.moduleUrl("dojo","resources/blank.gif")).toString(),postscript:function(_12e,_12f){this.create(_12e,_12f);},create:function(_130,_131){this.srcNodeRef=dojo.byId(_131);this._connects=[];this._subscribes=[];this._deferredConnects=dojo.clone(this._deferredConnects);for(var attr in this.attributeMap){delete this._deferredConnects[attr];}for(attr in this._deferredConnects){if(this[attr]!==dijit._connectOnUseEventHandler){delete this._deferredConnects[attr];}}if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_130){this.params=_130;dojo.mixin(this,_130);}this.postMixInProperties();if(!this.id){this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));}dijit.registry.add(this);this.buildRendering();if(this.domNode){this._applyAttributes();var _132=this.srcNodeRef;if(_132&&_132.parentNode){_132.parentNode.replaceChild(this.domNode,_132);}for(attr in this.params){this._onConnect(attr);}}if(this.domNode){this.domNode.setAttribute("widgetId",this.id);}this.postCreate();if(this.srcNodeRef&&!this.srcNodeRef.parentNode){delete this.srcNodeRef;}this._created=true;},_applyAttributes:function(){var _133=function(attr,_134){if((_134.params&&attr in _134.params)||_134[attr]){_134.attr(attr,_134[attr]);}};for(var attr in this.attributeMap){_133(attr,this);}dojo.forEach(_129(this),function(a){if(!(a in this.attributeMap)){_133(a,this);}},this);},postMixInProperties:function(){},buildRendering:function(){this.domNode=this.srcNodeRef||dojo.create("div");},postCreate:function(){},startup:function(){this._started=true;},destroyRecursive:function(_135){this._beingDestroyed=true;this.destroyDescendants(_135);this.destroy(_135);},destroy:function(_136){this._beingDestroyed=true;this.uninitialize();var d=dojo,dfe=d.forEach,dun=d.unsubscribe;dfe(this._connects,function(_137){dfe(_137,d.disconnect);});dfe(this._subscribes,function(_138){dun(_138);});dfe(this._supportingWidgets||[],function(w){if(w.destroyRecursive){w.destroyRecursive();}else{if(w.destroy){w.destroy();}}});this.destroyRendering(_136);dijit.registry.remove(this.id);this._destroyed=true;},destroyRendering:function(_139){if(this.bgIframe){this.bgIframe.destroy(_139);delete this.bgIframe;}if(this.domNode){if(_139){dojo.removeAttr(this.domNode,"widgetId");}else{dojo.destroy(this.domNode);}delete this.domNode;}if(this.srcNodeRef){if(!_139){dojo.destroy(this.srcNodeRef);}delete this.srcNodeRef;}},destroyDescendants:function(_13a){dojo.forEach(this.getChildren(),function(_13b){if(_13b.destroyRecursive){_13b.destroyRecursive(_13a);}});},uninitialize:function(){return false;},onFocus:function(){},onBlur:function(){},_onFocus:function(e){this.onFocus();},_onBlur:function(){this.onBlur();},_onConnect:function(_13c){if(_13c in this._deferredConnects){var _13d=this[this._deferredConnects[_13c]||"domNode"];this.connect(_13d,_13c.toLowerCase(),_13c);delete this._deferredConnects[_13c];}},_setClassAttr:function(_13e){var _13f=this[this.attributeMap["class"]||"domNode"];dojo.removeClass(_13f,this["class"]);this["class"]=_13e;dojo.addClass(_13f,_13e);},_setStyleAttr:function(_140){var _141=this[this.attributeMap.style||"domNode"];if(dojo.isObject(_140)){dojo.style(_141,_140);}else{if(_141.style.cssText){_141.style.cssText+="; "+_140;}else{_141.style.cssText=_140;}}this.style=_140;},setAttribute:function(attr,_142){dojo.deprecated(this.declaredClass+"::setAttribute() is deprecated. Use attr() instead.","","2.0");this.attr(attr,_142);},_attrToDom:function(attr,_143){var _144=this.attributeMap[attr];dojo.forEach(dojo.isArray(_144)?_144:[_144],function(_145){var _146=this[_145.node||_145||"domNode"];var type=_145.type||"attribute";switch(type){case "attribute":if(dojo.isFunction(_143)){_143=dojo.hitch(this,_143);}var _147=_145.attribute?_145.attribute:(/^on[A-Z][a-zA-Z]*$/.test(attr)?attr.toLowerCase():attr);dojo.attr(_146,_147,_143);break;case "innerText":_146.innerHTML="";_146.appendChild(dojo.doc.createTextNode(_143));break;case "innerHTML":_146.innerHTML=_143;break;case "class":dojo.removeClass(_146,this[attr]);dojo.addClass(_146,_143);break;}},this);this[attr]=_143;},attr:function(name,_148){var args=arguments.length;if(args==1&&!dojo.isString(name)){for(var x in name){this.attr(x,name[x]);}return this;}var _149=this._getAttrNames(name);if(args>=2){if(this[_149.s]){args=dojo._toArray(arguments,1);return this[_149.s].apply(this,args)||this;}else{if(name in this.attributeMap){this._attrToDom(name,_148);}this[name]=_148;}return this;}else{return this[_149.g]?this[_149.g]():this[name];}},_attrPairNames:{},_getAttrNames:function(name){var apn=this._attrPairNames;if(apn[name]){return apn[name];}var uc=name.charAt(0).toUpperCase()+name.substr(1);return (apn[name]={n:name+"Node",s:"_set"+uc+"Attr",g:"_get"+uc+"Attr"});},toString:function(){return "[Widget "+this.declaredClass+", "+(this.id||"NO ID")+"]";},getDescendants:function(){return this.containerNode?dojo.query("[widgetId]",this.containerNode).map(dijit.byNode):[];},getChildren:function(){return this.containerNode?dijit.findWidgets(this.containerNode):[];},nodesWithKeyClick:["input","button"],connect:function(obj,_14a,_14b){var d=dojo,dc=d._connect,_14c=[];if(_14a=="ondijitclick"){if(!this.nodesWithKeyClick[obj.tagName.toLowerCase()]){var m=d.hitch(this,_14b);_14c.push(dc(obj,"onkeydown",this,function(e){if((e.keyCode==d.keys.ENTER||e.keyCode==d.keys.SPACE)&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){dijit._lastKeyDownNode=e.target;d.stopEvent(e);}}),dc(obj,"onkeyup",this,function(e){if((e.keyCode==d.keys.ENTER||e.keyCode==d.keys.SPACE)&&e.target===dijit._lastKeyDownNode&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){dijit._lastKeyDownNode=null;return m(e);}}));}_14a="onclick";}_14c.push(dc(obj,_14a,this,_14b));this._connects.push(_14c);return _14c;},disconnect:function(_14d){for(var i=0;i<this._connects.length;i++){if(this._connects[i]==_14d){dojo.forEach(_14d,dojo.disconnect);this._connects.splice(i,1);return;}}},subscribe:function(_14e,_14f){var d=dojo,_150=d.subscribe(_14e,this,_14f);this._subscribes.push(_150);return _150;},unsubscribe:function(_151){for(var i=0;i<this._subscribes.length;i++){if(this._subscribes[i]==_151){dojo.unsubscribe(_151);this._subscribes.splice(i,1);return;}}},isLeftToRight:function(){return dojo._isBodyLtr();},isFocusable:function(){return this.focus&&(dojo.style(this.domNode,"display")!="none");},placeAt:function(_152,_153){if(_152.declaredClass&&_152.addChild){_152.addChild(this,_153);}else{dojo.place(this.domNode,_152,_153);}return this;},_onShow:function(){this.onShow();},onShow:function(){},onHide:function(){}});})();}if(!dojo._hasResource["dojo.string"]){dojo._hasResource["dojo.string"]=true;dojo.provide("dojo.string");dojo.string.rep=function(str,num){if(num<=0||!str){return "";}var buf=[];for(;;){if(num&1){buf.push(str);}if(!(num>>=1)){break;}str+=str;}return buf.join("");};dojo.string.pad=function(text,size,ch,end){if(!ch){ch="0";}var out=String(text),pad=dojo.string.rep(ch,Math.ceil((size-out.length)/ch.length));return end?out+pad:pad+out;};dojo.string.substitute=function(_154,map,_155,_156){_156=_156||dojo.global;_155=_155?dojo.hitch(_156,_155):function(v){return v;};return _154.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_157,key,_158){var _159=dojo.getObject(key,false,map);if(_158){_159=dojo.getObject(_158,false,_156).call(_156,_159,key);}return _155(_159,key).toString();});};dojo.string.trim=String.prototype.trim?dojo.trim:function(str){str=str.replace(/^\s+/,"");for(var i=str.length-1;i>=0;i--){if(/\S/.test(str.charAt(i))){str=str.substring(0,i+1);break;}}return str;};}if(!dojo._hasResource["dojo.cache"]){dojo._hasResource["dojo.cache"]=true;dojo.provide("dojo.cache");(function(){var _15a={};dojo.cache=function(_15b,url,_15c){if(typeof _15b=="string"){var _15d=dojo.moduleUrl(_15b,url);}else{_15d=_15b;_15c=url;}var key=_15d.toString();var val=_15c;if(_15c!==undefined&&!dojo.isString(_15c)){val=("value" in _15c?_15c.value:undefined);}var _15e=_15c&&_15c.sanitize?true:false;if(val||val===null){if(val==null){delete _15a[key];}else{val=_15a[key]=_15e?dojo.cache._sanitize(val):val;}}else{if(!(key in _15a)){val=dojo._getText(key);_15a[key]=_15e?dojo.cache._sanitize(val):val;}val=_15a[key];}return val;};dojo.cache._sanitize=function(val){if(val){val=val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _15f=val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_15f){val=_15f[1];}}else{val="";}return val;};})();}if(!dojo._hasResource["dijit._Templated"]){dojo._hasResource["dijit._Templated"]=true;dojo.provide("dijit._Templated");dojo.declare("dijit._Templated",null,{templateString:null,templatePath:null,widgetsInTemplate:false,_skipNodeCache:false,_earlyTemplatedStartup:false,constructor:function(){this._attachPoints=[];},_stringRepl:function(tmpl){var _160=this.declaredClass,_161=this;return dojo.string.substitute(tmpl,this,function(_162,key){if(key.charAt(0)=="!"){_162=dojo.getObject(key.substr(1),false,_161);}if(typeof _162=="undefined"){throw new Error(_160+" template:"+key);}if(_162==null){return "";}return key.charAt(0)=="!"?_162:_162.toString().replace(/"/g,"&quot;");},this);},buildRendering:function(){var _163=dijit._Templated.getCachedTemplate(this.templatePath,this.templateString,this._skipNodeCache);var node;if(dojo.isString(_163)){node=dojo._toDom(this._stringRepl(_163));if(node.nodeType!=1){throw new Error("Invalid template: "+_163);}}else{node=_163.cloneNode(true);}this.domNode=node;this._attachTemplateNodes(node);if(this.widgetsInTemplate){var _164=dojo.parser,qry,attr;if(_164._query!="[dojoType]"){qry=_164._query;attr=_164._attrName;_164._query="[dojoType]";_164._attrName="dojoType";}var cw=(this._startupWidgets=dojo.parser.parse(node,{noStart:!this._earlyTemplatedStartup}));if(qry){_164._query=qry;_164._attrName=attr;}this._supportingWidgets=dijit.findWidgets(node);this._attachTemplateNodes(cw,function(n,p){return n[p];});}this._fillContent(this.srcNodeRef);},_fillContent:function(_165){var dest=this.containerNode;if(_165&&dest){while(_165.hasChildNodes()){dest.appendChild(_165.firstChild);}}},_attachTemplateNodes:function(_166,_167){_167=_167||function(n,p){return n.getAttribute(p);};var _168=dojo.isArray(_166)?_166:(_166.all||_166.getElementsByTagName("*"));var x=dojo.isArray(_166)?0:-1;for(;x<_168.length;x++){var _169=(x==-1)?_166:_168[x];if(this.widgetsInTemplate&&_167(_169,"dojoType")){continue;}var _16a=_167(_169,"dojoAttachPoint");if(_16a){var _16b,_16c=_16a.split(/\s*,\s*/);while((_16b=_16c.shift())){if(dojo.isArray(this[_16b])){this[_16b].push(_169);}else{this[_16b]=_169;}this._attachPoints.push(_16b);}}var _16d=_167(_169,"dojoAttachEvent");if(_16d){var _16e,_16f=_16d.split(/\s*,\s*/);var trim=dojo.trim;while((_16e=_16f.shift())){if(_16e){var _170=null;if(_16e.indexOf(":")!=-1){var _171=_16e.split(":");_16e=trim(_171[0]);_170=trim(_171[1]);}else{_16e=trim(_16e);}if(!_170){_170=_16e;}this.connect(_169,_16e,_170);}}}var role=_167(_169,"waiRole");if(role){dijit.setWaiRole(_169,role);}var _172=_167(_169,"waiState");if(_172){dojo.forEach(_172.split(/\s*,\s*/),function(_173){if(_173.indexOf("-")!=-1){var pair=_173.split("-");dijit.setWaiState(_169,pair[0],pair[1]);}});}}},startup:function(){dojo.forEach(this._startupWidgets,function(w){if(w&&!w._started&&w.startup){w.startup();}});this.inherited(arguments);},destroyRendering:function(){dojo.forEach(this._attachPoints,function(_174){delete this[_174];},this);this._attachPoints=[];this.inherited(arguments);}});dijit._Templated._templateCache={};dijit._Templated.getCachedTemplate=function(_175,_176,_177){var _178=dijit._Templated._templateCache;var key=_176||_175;var _179=_178[key];if(_179){try{if(!_179.ownerDocument||_179.ownerDocument==dojo.doc){return _179;}}catch(e){}dojo.destroy(_179);}if(!_176){_176=dojo.cache(_175,{sanitize:true});}_176=dojo.string.trim(_176);if(_177||_176.match(/\$\{([^\}]+)\}/g)){return (_178[key]=_176);}else{var node=dojo._toDom(_176);if(node.nodeType!=1){throw new Error("Invalid template: "+_176);}return (_178[key]=node);}};if(dojo.isIE){dojo.addOnWindowUnload(function(){var _17a=dijit._Templated._templateCache;for(var key in _17a){var _17b=_17a[key];if(typeof _17b=="object"){dojo.destroy(_17b);}delete _17a[key];}});}dojo.extend(dijit._Widget,{dojoAttachEvent:"",dojoAttachPoint:"",waiRole:"",waiState:""});}if(!dojo._hasResource["dijit._Container"]){dojo._hasResource["dijit._Container"]=true;dojo.provide("dijit._Container");dojo.declare("dijit._Container",null,{isContainer:true,buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}},addChild:function(_17c,_17d){var _17e=this.containerNode;if(_17d&&typeof _17d=="number"){var _17f=this.getChildren();if(_17f&&_17f.length>=_17d){_17e=_17f[_17d-1].domNode;_17d="after";}}dojo.place(_17c.domNode,_17e,_17d);if(this._started&&!_17c._started){_17c.startup();}},removeChild:function(_180){if(typeof _180=="number"&&_180>0){_180=this.getChildren()[_180];}if(_180&&_180.domNode){var node=_180.domNode;node.parentNode.removeChild(node);}},getChildren:function(){return dojo.query("> [widgetId]",this.containerNode).map(dijit.byNode);},hasChildren:function(){return dojo.query("> [widgetId]",this.containerNode).length>0;},destroyDescendants:function(_181){dojo.forEach(this.getChildren(),function(_182){_182.destroyRecursive(_181);});},_getSiblingOfChild:function(_183,dir){var node=_183.domNode,_184=(dir>0?"nextSibling":"previousSibling");do{node=node[_184];}while(node&&(node.nodeType!=1||!dijit.byNode(node)));return node&&dijit.byNode(node);},getIndexOfChild:function(_185){return dojo.indexOf(this.getChildren(),_185);},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_186){_186.startup();});this.inherited(arguments);}});}if(!dojo._hasResource["dijit._Contained"]){dojo._hasResource["dijit._Contained"]=true;dojo.provide("dijit._Contained");dojo.declare("dijit._Contained",null,{getParent:function(){var _187=dijit.getEnclosingWidget(this.domNode.parentNode);return _187&&_187.isContainer?_187:null;},_getSibling:function(_188){var node=this.domNode;do{node=node[_188+"Sibling"];}while(node&&node.nodeType!=1);return node&&dijit.byNode(node);},getPreviousSibling:function(){return this._getSibling("previous");},getNextSibling:function(){return this._getSibling("next");},getIndexInParent:function(){var p=this.getParent();if(!p||!p.getIndexOfChild){return -1;}return p.getIndexOfChild(this);}});}if(!dojo._hasResource["dijit.layout._LayoutWidget"]){dojo._hasResource["dijit.layout._LayoutWidget"]=true;dojo.provide("dijit.layout._LayoutWidget");dojo.declare("dijit.layout._LayoutWidget",[dijit._Widget,dijit._Container,dijit._Contained],{baseClass:"dijitLayoutContainer",isLayoutContainer:true,postCreate:function(){dojo.addClass(this.domNode,"dijitContainer");dojo.addClass(this.domNode,this.baseClass);this.inherited(arguments);},startup:function(){if(this._started){return;}this.inherited(arguments);var _189=this.getParent&&this.getParent();if(!(_189&&_189.isLayoutContainer)){this.resize();this.connect(dojo.isIE?this.domNode:dojo.global,"onresize",function(){this.resize();});}},resize:function(_18a,_18b){var node=this.domNode;if(_18a){dojo.marginBox(node,_18a);if(_18a.t){node.style.top=_18a.t+"px";}if(_18a.l){node.style.left=_18a.l+"px";}}var mb=_18b||{};dojo.mixin(mb,_18a||{});if(!("h" in mb)||!("w" in mb)){mb=dojo.mixin(dojo.marginBox(node),mb);}var cs=dojo.getComputedStyle(node);var me=dojo._getMarginExtents(node,cs);var be=dojo._getBorderExtents(node,cs);var bb=(this._borderBox={w:mb.w-(me.w+be.w),h:mb.h-(me.h+be.h)});var pe=dojo._getPadExtents(node,cs);this._contentBox={l:dojo._toPixelValue(node,cs.paddingLeft),t:dojo._toPixelValue(node,cs.paddingTop),w:bb.w-pe.w,h:bb.h-pe.h};this.layout();},layout:function(){},_setupChild:function(_18c){dojo.addClass(_18c.domNode,this.baseClass+"-child");if(_18c.baseClass){dojo.addClass(_18c.domNode,this.baseClass+"-"+_18c.baseClass);}},addChild:function(_18d,_18e){this.inherited(arguments);if(this._started){this._setupChild(_18d);}},removeChild:function(_18f){dojo.removeClass(_18f.domNode,this.baseClass+"-child");if(_18f.baseClass){dojo.removeClass(_18f.domNode,this.baseClass+"-"+_18f.baseClass);}this.inherited(arguments);}});dijit.layout.marginBox2contentBox=function(node,mb){var cs=dojo.getComputedStyle(node);var me=dojo._getMarginExtents(node,cs);var pb=dojo._getPadBorderExtents(node,cs);return {l:dojo._toPixelValue(node,cs.paddingLeft),t:dojo._toPixelValue(node,cs.paddingTop),w:mb.w-(me.w+pb.w),h:mb.h-(me.h+pb.h)};};(function(){var _190=function(word){return word.substring(0,1).toUpperCase()+word.substring(1);};var size=function(_191,dim){_191.resize?_191.resize(dim):dojo.marginBox(_191.domNode,dim);dojo.mixin(_191,dojo.marginBox(_191.domNode));dojo.mixin(_191,dim);};dijit.layout.layoutChildren=function(_192,dim,_193){dim=dojo.mixin({},dim);dojo.addClass(_192,"dijitLayoutContainer");_193=dojo.filter(_193,function(item){return item.layoutAlign!="client";}).concat(dojo.filter(_193,function(item){return item.layoutAlign=="client";}));dojo.forEach(_193,function(_194){var elm=_194.domNode,pos=_194.layoutAlign;var _195=elm.style;_195.left=dim.l+"px";_195.top=dim.t+"px";_195.bottom=_195.right="auto";dojo.addClass(elm,"dijitAlign"+_190(pos));if(pos=="top"||pos=="bottom"){size(_194,{w:dim.w});dim.h-=_194.h;if(pos=="top"){dim.t+=_194.h;}else{_195.top=dim.t+dim.h+"px";}}else{if(pos=="left"||pos=="right"){size(_194,{h:dim.h});dim.w-=_194.w;if(pos=="left"){dim.l+=_194.w;}else{_195.left=dim.l+dim.w+"px";}}else{if(pos=="client"){size(_194,dim);}}}});};})();}if(!dojo._hasResource["dijit.form._FormWidget"]){dojo._hasResource["dijit.form._FormWidget"]=true;dojo.provide("dijit.form._FormWidget");dojo.declare("dijit.form._FormWidget",[dijit._Widget,dijit._Templated],{baseClass:"",name:"",alt:"",value:"",type:"text",tabIndex:"0",disabled:false,intermediateChanges:false,scrollOnFocus:true,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{value:"focusNode",id:"focusNode",tabIndex:"focusNode",alt:"focusNode",title:"focusNode"}),postMixInProperties:function(){this.nameAttrSetting=this.name?("name='"+this.name+"'"):"";this.inherited(arguments);},_setDisabledAttr:function(_196){this.disabled=_196;dojo.attr(this.focusNode,"disabled",_196);if(this.valueNode){dojo.attr(this.valueNode,"disabled",_196);}dijit.setWaiState(this.focusNode,"disabled",_196);if(_196){this._hovering=false;this._active=false;this.focusNode.setAttribute("tabIndex","-1");}else{this.focusNode.setAttribute("tabIndex",this.tabIndex);}this._setStateClass();},setDisabled:function(_197){dojo.deprecated("setDisabled("+_197+") is deprecated. Use attr('disabled',"+_197+") instead.","","2.0");this.attr("disabled",_197);},_onFocus:function(e){if(this.scrollOnFocus){dijit.scrollIntoView(this.domNode);}this.inherited(arguments);},_onMouse:function(_198){var _199=_198.currentTarget;if(_199&&_199.getAttribute){this.stateModifier=_199.getAttribute("stateModifier")||"";}if(!this.disabled){switch(_198.type){case "mouseenter":case "mouseover":this._hovering=true;this._active=this._mouseDown;break;case "mouseout":case "mouseleave":this._hovering=false;this._active=false;break;case "mousedown":this._active=true;this._mouseDown=true;var _19a=this.connect(dojo.body(),"onmouseup",function(){if(this._mouseDown&&this.isFocusable()){this.focus();}this._active=false;this._mouseDown=false;this._setStateClass();this.disconnect(_19a);});break;}this._setStateClass();}},isFocusable:function(){return !this.disabled&&!this.readOnly&&this.focusNode&&(dojo.style(this.domNode,"display")!="none");},focus:function(){dijit.focus(this.focusNode);},_setStateClass:function(){var _19b=this.baseClass.split(" ");function _19c(_19d){_19b=_19b.concat(dojo.map(_19b,function(c){return c+_19d;}),"dijit"+_19d);};if(this.checked){_19c("Checked");}if(this.state){_19c(this.state);}if(this.selected){_19c("Selected");}if(this.disabled){_19c("Disabled");}else{if(this.readOnly){_19c("ReadOnly");}else{if(this._active){_19c(this.stateModifier+"Active");}else{if(this._focused){_19c("Focused");}if(this._hovering){_19c(this.stateModifier+"Hover");}}}}var tn=this.stateNode||this.domNode,_19e={};dojo.forEach(tn.className.split(" "),function(c){_19e[c]=true;});if("_stateClasses" in this){dojo.forEach(this._stateClasses,function(c){delete _19e[c];});}dojo.forEach(_19b,function(c){_19e[c]=true;});var _19f=[];for(var c in _19e){_19f.push(c);}tn.className=_19f.join(" ");this._stateClasses=_19b;},compare:function(val1,val2){if(typeof val1=="number"&&typeof val2=="number"){return (isNaN(val1)&&isNaN(val2))?0:val1-val2;}else{if(val1>val2){return 1;}else{if(val1<val2){return -1;}else{return 0;}}}},onChange:function(_1a0){},_onChangeActive:false,_handleOnChange:function(_1a1,_1a2){this._lastValue=_1a1;if(this._lastValueReported==undefined&&(_1a2===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_1a1;}if((this.intermediateChanges||_1a2||_1a2===undefined)&&((typeof _1a1!=typeof this._lastValueReported)||this.compare(_1a1,this._lastValueReported)!=0)){this._lastValueReported=_1a1;if(this._onChangeActive){if(this._onChangeHandle){clearTimeout(this._onChangeHandle);}this._onChangeHandle=setTimeout(dojo.hitch(this,function(){this._onChangeHandle=null;this.onChange(_1a1);}),0);}}},create:function(){this.inherited(arguments);this._onChangeActive=true;this._setStateClass();},destroy:function(){if(this._onChangeHandle){clearTimeout(this._onChangeHandle);this.onChange(this._lastValueReported);}this.inherited(arguments);},setValue:function(_1a3){dojo.deprecated("dijit.form._FormWidget:setValue("+_1a3+") is deprecated.  Use attr('value',"+_1a3+") instead.","","2.0");this.attr("value",_1a3);},getValue:function(){dojo.deprecated(this.declaredClass+"::getValue() is deprecated. Use attr('value') instead.","","2.0");return this.attr("value");}});dojo.declare("dijit.form._FormValueWidget",dijit.form._FormWidget,{readOnly:false,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:"",readOnly:"focusNode"}),_setReadOnlyAttr:function(_1a4){this.readOnly=_1a4;dojo.attr(this.focusNode,"readOnly",_1a4);dijit.setWaiState(this.focusNode,"readonly",_1a4);this._setStateClass();},postCreate:function(){if(dojo.isIE){this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);}if(this._resetValue===undefined){this._resetValue=this.value;}},_setValueAttr:function(_1a5,_1a6){this.value=_1a5;this._handleOnChange(_1a5,_1a6);},_getValueAttr:function(){return this._lastValue;},undo:function(){this._setValueAttr(this._lastValueReported,false);},reset:function(){this._hasBeenBlurred=false;this._setValueAttr(this._resetValue,true);},_onKeyDown:function(e){if(e.keyCode==dojo.keys.ESCAPE&&!(e.ctrlKey||e.altKey||e.metaKey)){var te;if(dojo.isIE){e.preventDefault();te=document.createEventObject();te.keyCode=dojo.keys.ESCAPE;te.shiftKey=e.shiftKey;e.srcElement.fireEvent("onkeypress",te);}}},_layoutHackIE7:function(){if(dojo.isIE==7){var _1a7=this.domNode;var _1a8=_1a7.parentNode;var _1a9=_1a7.firstChild||_1a7;var _1aa=_1a9.style.filter;while(_1a8&&_1a8.clientHeight==0){_1a8._disconnectHandle=this.connect(_1a8,"onscroll",dojo.hitch(this,function(e){this.disconnect(_1a8._disconnectHandle);_1a8.removeAttribute("_disconnectHandle");_1a9.style.filter=(new Date()).getMilliseconds();setTimeout(function(){_1a9.style.filter=_1aa;},0);}));_1a8=_1a8.parentNode;}}}});}if(!dojo._hasResource["dijit.dijit"]){dojo._hasResource["dijit.dijit"]=true;dojo.provide("dijit.dijit");}if(!dojo._hasResource["dijit._KeyNavContainer"]){dojo._hasResource["dijit._KeyNavContainer"]=true;dojo.provide("dijit._KeyNavContainer");dojo.declare("dijit._KeyNavContainer",dijit._Container,{tabIndex:"0",_keyNavCodes:{},connectKeyNavHandlers:function(_1ab,_1ac){var _1ad=(this._keyNavCodes={});var prev=dojo.hitch(this,this.focusPrev);var next=dojo.hitch(this,this.focusNext);dojo.forEach(_1ab,function(code){_1ad[code]=prev;});dojo.forEach(_1ac,function(code){_1ad[code]=next;});this.connect(this.domNode,"onkeypress","_onContainerKeypress");this.connect(this.domNode,"onfocus","_onContainerFocus");},startupKeyNavChildren:function(){dojo.forEach(this.getChildren(),dojo.hitch(this,"_startupChild"));},addChild:function(_1ae,_1af){dijit._KeyNavContainer.superclass.addChild.apply(this,arguments);this._startupChild(_1ae);},focus:function(){this.focusFirstChild();},focusFirstChild:function(){var _1b0=this._getFirstFocusableChild();if(_1b0){this.focusChild(_1b0);}},focusNext:function(){var _1b1=this._getNextFocusableChild(this.focusedChild,1);this.focusChild(_1b1);},focusPrev:function(){var _1b2=this._getNextFocusableChild(this.focusedChild,-1);this.focusChild(_1b2,true);},focusChild:function(_1b3,last){if(this.focusedChild&&_1b3!==this.focusedChild){this._onChildBlur(this.focusedChild);}_1b3.focus(last?"end":"start");this.focusedChild=_1b3;},_startupChild:function(_1b4){_1b4.attr("tabIndex","-1");this.connect(_1b4,"_onFocus",function(){_1b4.attr("tabIndex",this.tabIndex);});this.connect(_1b4,"_onBlur",function(){_1b4.attr("tabIndex","-1");});},_onContainerFocus:function(evt){if(evt.target!==this.domNode){return;}this.focusFirstChild();dojo.attr(this.domNode,"tabIndex","-1");},_onBlur:function(evt){if(this.tabIndex){dojo.attr(this.domNode,"tabIndex",this.tabIndex);}this.inherited(arguments);},_onContainerKeypress:function(evt){if(evt.ctrlKey||evt.altKey){return;}var func=this._keyNavCodes[evt.charOrCode];if(func){func();dojo.stopEvent(evt);}},_onChildBlur:function(_1b5){},_getFirstFocusableChild:function(){return this._getNextFocusableChild(null,1);},_getNextFocusableChild:function(_1b6,dir){if(_1b6){_1b6=this._getSiblingOfChild(_1b6,dir);}var _1b7=this.getChildren();for(var i=0;i<_1b7.length;i++){if(!_1b6){_1b6=_1b7[(dir>0)?0:(_1b7.length-1)];}if(_1b6.isFocusable()){return _1b6;}_1b6=this._getSiblingOfChild(_1b6,dir);}return null;}});}if(!dojo._hasResource["dijit.MenuItem"]){dojo._hasResource["dijit.MenuItem"]=true;dojo.provide("dijit.MenuItem");dojo.declare("dijit.MenuItem",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:dojo.cache("dijit","templates/MenuItem.html","<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" waiRole=\"presentation\">\n\t\t<div dojoAttachPoint=\"arrowWrapper\" style=\"visibility: hidden\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuExpand\">\n\t\t\t<span class=\"dijitMenuExpandA11y\">+</span>\n\t\t</div>\n\t</td>\n</tr>\n"),attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{label:{node:"containerNode",type:"innerHTML"},iconClass:{node:"iconNode",type:"class"}}),label:"",iconClass:"",accelKey:"",disabled:false,_fillContent:function(_1b8){if(_1b8&&!("label" in this.params)){this.attr("label",_1b8.innerHTML);}},postCreate:function(){dojo.setSelectable(this.domNode,false);var _1b9=this.id+"_text";dojo.attr(this.containerNode,"id",_1b9);if(this.accelKeyNode){dojo.attr(this.accelKeyNode,"id",this.id+"_accel");_1b9+=" "+this.id+"_accel";}dijit.setWaiState(this.domNode,"labelledby",_1b9);},_onHover:function(){dojo.addClass(this.domNode,"dijitMenuItemHover");this.getParent().onItemHover(this);},_onUnhover:function(){dojo.removeClass(this.domNode,"dijitMenuItemHover");this.getParent().onItemUnhover(this);},_onClick:function(evt){this.getParent().onItemClick(this,evt);dojo.stopEvent(evt);},onClick:function(evt){},focus:function(){try{if(dojo.isIE==8){this.containerNode.focus();}dijit.focus(this.focusNode);}catch(e){}},_onFocus:function(){this._setSelected(true);this.getParent()._onItemFocus(this);this.inherited(arguments);},_setSelected:function(_1ba){dojo.toggleClass(this.domNode,"dijitMenuItemSelected",_1ba);},setLabel:function(_1bb){dojo.deprecated("dijit.MenuItem.setLabel() is deprecated.  Use attr('label', ...) instead.","","2.0");this.attr("label",_1bb);},setDisabled:function(_1bc){dojo.deprecated("dijit.Menu.setDisabled() is deprecated.  Use attr('disabled', bool) instead.","","2.0");this.attr("disabled",_1bc);},_setDisabledAttr:function(_1bd){this.disabled=_1bd;dojo[_1bd?"addClass":"removeClass"](this.domNode,"dijitMenuItemDisabled");dijit.setWaiState(this.focusNode,"disabled",_1bd?"true":"false");},_setAccelKeyAttr:function(_1be){this.accelKey=_1be;this.accelKeyNode.style.display=_1be?"":"none";this.accelKeyNode.innerHTML=_1be;dojo.attr(this.containerNode,"colSpan",_1be?"1":"2");}});}if(!dojo._hasResource["dijit.PopupMenuItem"]){dojo._hasResource["dijit.PopupMenuItem"]=true;dojo.provide("dijit.PopupMenuItem");dojo.declare("dijit.PopupMenuItem",dijit.MenuItem,{_fillContent:function(){if(this.srcNodeRef){var _1bf=dojo.query("*",this.srcNodeRef);dijit.PopupMenuItem.superclass._fillContent.call(this,_1bf[0]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}this.inherited(arguments);if(!this.popup){var node=dojo.query("[widgetId]",this.dropDownContainer)[0];this.popup=dijit.byNode(node);}dojo.body().appendChild(this.popup.domNode);this.popup.domNode.style.display="none";if(this.arrowWrapper){dojo.style(this.arrowWrapper,"visibility","");}dijit.setWaiState(this.focusNode,"haspopup","true");},destroyDescendants:function(){if(this.popup){if(!this.popup._destroyed){this.popup.destroyRecursive();}delete this.popup;}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.CheckedMenuItem"]){dojo._hasResource["dijit.CheckedMenuItem"]=true;dojo.provide("dijit.CheckedMenuItem");dojo.declare("dijit.CheckedMenuItem",dijit.MenuItem,{templateString:dojo.cache("dijit","templates/CheckedMenuItem.html","<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">&#10003;</span>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode,labelNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" waiRole=\"presentation\">\n\t</td>\n</tr>\n"),checked:false,_setCheckedAttr:function(_1c0){dojo.toggleClass(this.domNode,"dijitCheckedMenuItemChecked",_1c0);dijit.setWaiState(this.domNode,"checked",_1c0);this.checked=_1c0;},onChange:function(_1c1){},_onClick:function(e){if(!this.disabled){this.attr("checked",!this.checked);this.onChange(this.checked);}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.MenuSeparator"]){dojo._hasResource["dijit.MenuSeparator"]=true;dojo.provide("dijit.MenuSeparator");dojo.declare("dijit.MenuSeparator",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:dojo.cache("dijit","templates/MenuSeparator.html","<tr class=\"dijitMenuSeparator\">\n\t<td colspan=\"4\">\n\t\t<div class=\"dijitMenuSeparatorTop\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n</tr>\n"),postCreate:function(){dojo.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});}if(!dojo._hasResource["dijit.Menu"]){dojo._hasResource["dijit.Menu"]=true;dojo.provide("dijit.Menu");dojo.declare("dijit._MenuBase",[dijit._Widget,dijit._Templated,dijit._KeyNavContainer],{parentMenu:null,popupDelay:500,startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_1c2){_1c2.startup();});this.startupKeyNavChildren();this.inherited(arguments);},onExecute:function(){},onCancel:function(_1c3){},_moveToPopup:function(evt){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.focusedChild._onClick(evt);}else{var _1c4=this._getTopMenu();if(_1c4&&_1c4._isMenuBar){_1c4.focusNext();}}},_onPopupHover:function(evt){if(this.currentPopup&&this.currentPopup._pendingClose_timer){var _1c5=this.currentPopup.parentMenu;if(_1c5.focusedChild){_1c5.focusedChild._setSelected(false);}_1c5.focusedChild=this.currentPopup.from_item;_1c5.focusedChild._setSelected(true);this._stopPendingCloseTimer(this.currentPopup);}},onItemHover:function(item){if(this.isActive){this.focusChild(item);if(this.focusedChild.popup&&!this.focusedChild.disabled&&!this.hover_timer){this.hover_timer=setTimeout(dojo.hitch(this,"_openPopup"),this.popupDelay);}}if(this.focusedChild){this.focusChild(item);}this._hoveredChild=item;},_onChildBlur:function(item){this._stopPopupTimer();item._setSelected(false);var _1c6=item.popup;if(_1c6){this._stopPendingCloseTimer(_1c6);_1c6._pendingClose_timer=setTimeout(function(){_1c6._pendingClose_timer=null;if(_1c6.parentMenu){_1c6.parentMenu.currentPopup=null;}dijit.popup.close(_1c6);},this.popupDelay);}},onItemUnhover:function(item){if(this.isActive){this._stopPopupTimer();}if(this._hoveredChild==item){this._hoveredChild=null;}},_stopPopupTimer:function(){if(this.hover_timer){clearTimeout(this.hover_timer);this.hover_timer=null;}},_stopPendingCloseTimer:function(_1c7){if(_1c7._pendingClose_timer){clearTimeout(_1c7._pendingClose_timer);_1c7._pendingClose_timer=null;}},_stopFocusTimer:function(){if(this._focus_timer){clearTimeout(this._focus_timer);this._focus_timer=null;}},_getTopMenu:function(){for(var top=this;top.parentMenu;top=top.parentMenu){}return top;},onItemClick:function(item,evt){if(item.disabled){return false;}if(typeof this.isShowingNow=="undefined"){this._markActive();}this.focusChild(item);if(item.popup){this._openPopup();}else{this.onExecute();item.onClick(evt);}},_openPopup:function(){this._stopPopupTimer();var _1c8=this.focusedChild;if(!_1c8){return;}var _1c9=_1c8.popup;if(_1c9.isShowingNow){return;}if(this.currentPopup){this._stopPendingCloseTimer(this.currentPopup);dijit.popup.close(this.currentPopup);}_1c9.parentMenu=this;_1c9.from_item=_1c8;var self=this;dijit.popup.open({parent:this,popup:_1c9,around:_1c8.domNode,orient:this._orient||(this.isLeftToRight()?{"TR":"TL","TL":"TR","BR":"BL","BL":"BR"}:{"TL":"TR","TR":"TL","BL":"BR","BR":"BL"}),onCancel:function(){self.focusChild(_1c8);self._cleanUp();_1c8._setSelected(true);self.focusedChild=_1c8;},onExecute:dojo.hitch(this,"_cleanUp")});this.currentPopup=_1c9;_1c9.connect(_1c9.domNode,"onmouseenter",dojo.hitch(self,"_onPopupHover"));if(_1c9.focus){_1c9._focus_timer=setTimeout(dojo.hitch(_1c9,function(){this._focus_timer=null;this.focus();}),0);}},_markActive:function(){this.isActive=true;dojo.addClass(this.domNode,"dijitMenuActive");dojo.removeClass(this.domNode,"dijitMenuPassive");},onOpen:function(e){this.isShowingNow=true;this._markActive();},_markInactive:function(){this.isActive=false;dojo.removeClass(this.domNode,"dijitMenuActive");dojo.addClass(this.domNode,"dijitMenuPassive");},onClose:function(){this._stopFocusTimer();this._markInactive();this.isShowingNow=false;this.parentMenu=null;},_closeChild:function(){this._stopPopupTimer();if(this.focusedChild){this.focusedChild._setSelected(false);this.focusedChild._onUnhover();this.focusedChild=null;}if(this.currentPopup){dijit.popup.close(this.currentPopup);this.currentPopup=null;}},_onItemFocus:function(item){if(this._hoveredChild&&this._hoveredChild!=item){this._hoveredChild._onUnhover();}},_onBlur:function(){this._cleanUp();this.inherited(arguments);},_cleanUp:function(){this._closeChild();if(typeof this.isShowingNow=="undefined"){this._markInactive();}}});dojo.declare("dijit.Menu",dijit._MenuBase,{constructor:function(){this._bindings=[];},templateString:dojo.cache("dijit","templates/Menu.html","<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" waiRole=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n"),targetNodeIds:[],contextMenuForWindow:false,leftClickToOpen:false,refocus:true,_contextMenuWithMouse:false,postCreate:function(){if(this.contextMenuForWindow){this.bindDomNode(dojo.body());}else{dojo.forEach(this.targetNodeIds,this.bindDomNode,this);}var k=dojo.keys,l=this.isLeftToRight();this._openSubMenuKey=l?k.RIGHT_ARROW:k.LEFT_ARROW;this._closeSubMenuKey=l?k.LEFT_ARROW:k.RIGHT_ARROW;this.connectKeyNavHandlers([k.UP_ARROW],[k.DOWN_ARROW]);},_onKeyPress:function(evt){if(evt.ctrlKey||evt.altKey){return;}switch(evt.charOrCode){case this._openSubMenuKey:this._moveToPopup(evt);dojo.stopEvent(evt);break;case this._closeSubMenuKey:if(this.parentMenu){if(this.parentMenu._isMenuBar){this.parentMenu.focusPrev();}else{this.onCancel(false);}}else{dojo.stopEvent(evt);}break;}},_iframeContentWindow:function(_1ca){var win=dijit.getDocumentWindow(this._iframeContentDocument(_1ca))||this._iframeContentDocument(_1ca)["__parent__"]||(_1ca.name&&dojo.doc.frames[_1ca.name])||null;return win;},_iframeContentDocument:function(_1cb){var doc=_1cb.contentDocument||(_1cb.contentWindow&&_1cb.contentWindow.document)||(_1cb.name&&dojo.doc.frames[_1cb.name]&&dojo.doc.frames[_1cb.name].document)||null;return doc;},bindDomNode:function(node){node=dojo.byId(node);var cn;if(node.tagName.toLowerCase()=="iframe"){var _1cc=node,win=this._iframeContentWindow(_1cc);cn=dojo.withGlobal(win,dojo.body);}else{cn=(node==dojo.body()?dojo.doc.documentElement:node);}var _1cd={node:node,iframe:_1cc};dojo.attr(node,"_dijitMenu"+this.id,this._bindings.push(_1cd));var _1ce=dojo.hitch(this,function(cn){return [dojo.connect(cn,(this.leftClickToOpen)?"onclick":"oncontextmenu",this,function(evt){this._openMyself(evt,cn,_1cc);}),dojo.connect(cn,"onkeydown",this,"_contextKey"),dojo.connect(cn,"onmousedown",this,"_contextMouse")];});_1cd.connects=cn?_1ce(cn):[];if(_1cc){_1cd.onloadHandler=dojo.hitch(this,function(){var win=this._iframeContentWindow(_1cc);cn=dojo.withGlobal(win,dojo.body);_1cd.connects=_1ce(cn);});if(_1cc.addEventListener){_1cc.addEventListener("load",_1cd.onloadHandler,false);}else{_1cc.attachEvent("onload",_1cd.onloadHandler);}}},unBindDomNode:function(_1cf){var node;try{node=dojo.byId(_1cf);}catch(e){return;}var _1d0="_dijitMenu"+this.id;if(node&&dojo.hasAttr(node,_1d0)){var bid=dojo.attr(node,_1d0)-1,b=this._bindings[bid];dojo.forEach(b.connects,dojo.disconnect);var _1d1=b.iframe;if(_1d1){if(_1d1.removeEventListener){_1d1.removeEventListener("load",b.onloadHandler,false);}else{_1d1.detachEvent("onload",b.onloadHandler);}}dojo.removeAttr(node,_1d0);delete this._bindings[bid];}},_contextKey:function(e){this._contextMenuWithMouse=false;if(e.keyCode==dojo.keys.F10){dojo.stopEvent(e);if(e.shiftKey&&e.type=="keydown"){var _1d2={target:e.target,pageX:e.pageX,pageY:e.pageY};_1d2.preventDefault=_1d2.stopPropagation=function(){};window.setTimeout(dojo.hitch(this,function(){this._openMyself(_1d2);}),1);}}},_contextMouse:function(e){this._contextMenuWithMouse=true;},_openMyself:function(e,node,_1d3){if(this.leftClickToOpen&&e.button>0){return;}dojo.stopEvent(e);var x,y;if(dojo.isSafari||this._contextMenuWithMouse){x=e.pageX;y=e.pageY;if(_1d3){var od=e.target.ownerDocument,ifc=dojo.position(_1d3,true),win=this._iframeContentWindow(_1d3),_1d4=dojo.withGlobal(win,"_docScroll",dojo);var cs=dojo.getComputedStyle(_1d3),tp=dojo._toPixelValue,left=(dojo.isIE&&dojo.isQuirks?0:tp(_1d3,cs.paddingLeft))+(dojo.isIE&&dojo.isQuirks?tp(_1d3,cs.borderLeftWidth):0),top=(dojo.isIE&&dojo.isQuirks?0:tp(_1d3,cs.paddingTop))+(dojo.isIE&&dojo.isQuirks?tp(_1d3,cs.borderTopWidth):0);x+=ifc.x+left-_1d4.x;y+=ifc.y+top-_1d4.y;}}else{var _1d5=dojo.position(e.target,true);x=_1d5.x+10;y=_1d5.y+10;}var self=this;var _1d6=dijit.getFocus(this);function _1d7(){if(self.refocus){dijit.focus(_1d6);}dijit.popup.close(self);};dijit.popup.open({popup:this,x:x,y:y,onExecute:_1d7,onCancel:_1d7,orient:this.isLeftToRight()?"L":"R"});this.focus();this._onBlur=function(){this.inherited("_onBlur",arguments);dijit.popup.close(this);};},uninitialize:function(){dojo.forEach(this._bindings,function(b){if(b){this.unBindDomNode(b.node);}},this);this.inherited(arguments);}});}if(!dojo._hasResource["dojox.html.metrics"]){dojo._hasResource["dojox.html.metrics"]=true;dojo.provide("dojox.html.metrics");(function(){var dhm=dojox.html.metrics;dhm.getFontMeasurements=function(){var _1d8={"1em":0,"1ex":0,"100%":0,"12pt":0,"16px":0,"xx-small":0,"x-small":0,"small":0,"medium":0,"large":0,"x-large":0,"xx-large":0};if(dojo.isIE){dojo.doc.documentElement.style.fontSize="100%";}var div=dojo.doc.createElement("div");var ds=div.style;ds.position="absolute";ds.left="-100px";ds.top="0";ds.width="30px";ds.height="1000em";ds.border="0";ds.margin="0";ds.padding="0";ds.outline="0";ds.lineHeight="1";ds.overflow="hidden";dojo.body().appendChild(div);for(var p in _1d8){ds.fontSize=p;_1d8[p]=Math.round(div.offsetHeight*12/16)*16/12/1000;}dojo.body().removeChild(div);div=null;return _1d8;};var _1d9=null;dhm.getCachedFontMeasurements=function(_1da){if(_1da||!_1d9){_1d9=dhm.getFontMeasurements();}return _1d9;};var _1db=null,_1dc={};dhm.getTextBox=function(text,_1dd,_1de){var m;if(!_1db){m=_1db=dojo.doc.createElement("div");m.style.position="absolute";m.style.left="0px";m.style.top="-10000px";dojo.body().appendChild(m);}else{m=_1db;}m.className="";m.style.border="0";m.style.margin="0";m.style.padding="0";m.style.outline="0";if(arguments.length>1&&_1dd){for(var i in _1dd){if(i in _1dc){continue;}m.style[i]=_1dd[i];}}if(arguments.length>2&&_1de){m.className=_1de;}m.innerHTML=text;return dojo.marginBox(m);};var _1df={w:16,h:16};dhm.getScrollbar=function(){return {w:_1df.w,h:_1df.h};};dhm._fontResizeNode=null;dhm.initOnFontResize=function(_1e0){var f=dhm._fontResizeNode=dojo.doc.createElement("iframe");var fs=f.style;fs.position="absolute";fs.width="5em";fs.height="10em";fs.top="-10000px";if(dojo.isIE){f.onreadystatechange=function(){if(f.contentWindow.document.readyState=="complete"){f.onresize=f.contentWindow.parent[dojox._scopeName].html.metrics._fontresize;}};}else{f.onload=function(){f.contentWindow.onresize=f.contentWindow.parent[dojox._scopeName].html.metrics._fontresize;};}f.setAttribute("src","javascript:'<html><head><script>if(\"loadFirebugConsole\" in window){window.loadFirebugConsole();}</script></head><body></body></html>'");dojo.body().appendChild(f);dhm.initOnFontResize=function(){};};dhm.onFontResize=function(){};dhm._fontresize=function(){dhm.onFontResize();};dojo.addOnUnload(function(){var f=dhm._fontResizeNode;if(f){if(dojo.isIE&&f.onresize){f.onresize=null;}else{if(f.contentWindow&&f.contentWindow.onresize){f.contentWindow.onresize=null;}}dhm._fontResizeNode=null;}});dojo.addOnLoad(function(){try{var n=dojo.doc.createElement("div");n.style.cssText="top:0;left:0;width:100px;height:100px;overflow:scroll;position:absolute;visibility:hidden;";dojo.body().appendChild(n);_1df.w=n.offsetWidth-n.clientWidth;_1df.h=n.offsetHeight-n.clientHeight;dojo.body().removeChild(n);delete n;}catch(e){}if("fontSizeWatch" in dojo.config&&!!dojo.config.fontSizeWatch){dhm.initOnFontResize();}});})();}if(!dojo._hasResource["dojox.grid.util"]){dojo._hasResource["dojox.grid.util"]=true;dojo.provide("dojox.grid.util");(function(){var dgu=dojox.grid.util;dgu.na="...";dgu.rowIndexTag="gridRowIndex";dgu.gridViewTag="gridView";dgu.fire=function(ob,ev,args){var fn=ob&&ev&&ob[ev];return fn&&(args?fn.apply(ob,args):ob[ev]());};dgu.setStyleHeightPx=function(_1e1,_1e2){if(_1e2>=0){var s=_1e1.style;var v=_1e2+"px";if(_1e1&&s["height"]!=v){s["height"]=v;}}};dgu.mouseEvents=["mouseover","mouseout","mousedown","mouseup","click","dblclick","contextmenu"];dgu.keyEvents=["keyup","keydown","keypress"];dgu.funnelEvents=function(_1e3,_1e4,_1e5,_1e6){var evts=(_1e6?_1e6:dgu.mouseEvents.concat(dgu.keyEvents));for(var i=0,l=evts.length;i<l;i++){_1e4.connect(_1e3,"on"+evts[i],_1e5);}};dgu.removeNode=function(_1e7){_1e7=dojo.byId(_1e7);_1e7&&_1e7.parentNode&&_1e7.parentNode.removeChild(_1e7);return _1e7;};dgu.arrayCompare=function(inA,inB){for(var i=0,l=inA.length;i<l;i++){if(inA[i]!=inB[i]){return false;}}return (inA.length==inB.length);};dgu.arrayInsert=function(_1e8,_1e9,_1ea){if(_1e8.length<=_1e9){_1e8[_1e9]=_1ea;}else{_1e8.splice(_1e9,0,_1ea);}};dgu.arrayRemove=function(_1eb,_1ec){_1eb.splice(_1ec,1);};dgu.arraySwap=function(_1ed,inI,inJ){var _1ee=_1ed[inI];_1ed[inI]=_1ed[inJ];_1ed[inJ]=_1ee;};})();}if(!dojo._hasResource["dojox.grid._Scroller"]){dojo._hasResource["dojox.grid._Scroller"]=true;dojo.provide("dojox.grid._Scroller");(function(){var _1ef=function(_1f0){var i=0,n,p=_1f0.parentNode;while((n=p.childNodes[i++])){if(n==_1f0){return i-1;}}return -1;};var _1f1=function(_1f2){if(!_1f2){return;}var _1f3=function(inW){return inW.domNode&&dojo.isDescendant(inW.domNode,_1f2,true);};var ws=dijit.registry.filter(_1f3);for(var i=0,w;(w=ws[i]);i++){w.destroy();}delete ws;};var _1f4=function(_1f5){var node=dojo.byId(_1f5);return (node&&node.tagName?node.tagName.toLowerCase():"");};var _1f6=function(_1f7,_1f8){var _1f9=[];var i=0,n;while((n=_1f7.childNodes[i])){i++;if(_1f4(n)==_1f8){_1f9.push(n);}}return _1f9;};var _1fa=function(_1fb){return _1f6(_1fb,"div");};dojo.declare("dojox.grid._Scroller",null,{constructor:function(_1fc){this.setContentNodes(_1fc);this.pageHeights=[];this.pageNodes=[];this.stack=[];},rowCount:0,defaultRowHeight:32,keepRows:100,contentNode:null,scrollboxNode:null,defaultPageHeight:0,keepPages:10,pageCount:0,windowHeight:0,firstVisibleRow:0,lastVisibleRow:0,averageRowHeight:0,page:0,pageTop:0,init:function(_1fd,_1fe,_1ff){switch(arguments.length){case 3:this.rowsPerPage=_1ff;case 2:this.keepRows=_1fe;case 1:this.rowCount=_1fd;default:break;}this.defaultPageHeight=this.defaultRowHeight*this.rowsPerPage;this.pageCount=this._getPageCount(this.rowCount,this.rowsPerPage);this.setKeepInfo(this.keepRows);this.invalidate();if(this.scrollboxNode){this.scrollboxNode.scrollTop=0;this.scroll(0);this.scrollboxNode.onscroll=dojo.hitch(this,"onscroll");}},_getPageCount:function(_200,_201){return _200?(Math.ceil(_200/_201)||1):0;},destroy:function(){this.invalidateNodes();delete this.contentNodes;delete this.contentNode;delete this.scrollboxNode;},setKeepInfo:function(_202){this.keepRows=_202;this.keepPages=!this.keepRows?this.keepPages:Math.max(Math.ceil(this.keepRows/this.rowsPerPage),2);},setContentNodes:function(_203){this.contentNodes=_203;this.colCount=(this.contentNodes?this.contentNodes.length:0);this.pageNodes=[];for(var i=0;i<this.colCount;i++){this.pageNodes[i]=[];}},getDefaultNodes:function(){return this.pageNodes[0]||[];},invalidate:function(){this._invalidating=true;this.invalidateNodes();this.pageHeights=[];this.height=(this.pageCount?(this.pageCount-1)*this.defaultPageHeight+this.calcLastPageHeight():0);this.resize();this._invalidating=false;},updateRowCount:function(_204){this.invalidateNodes();this.rowCount=_204;var _205=this.pageCount;if(_205===0){this.height=1;}this.pageCount=this._getPageCount(this.rowCount,this.rowsPerPage);if(this.pageCount<_205){for(var i=_205-1;i>=this.pageCount;i--){this.height-=this.getPageHeight(i);delete this.pageHeights[i];}}else{if(this.pageCount>_205){this.height+=this.defaultPageHeight*(this.pageCount-_205-1)+this.calcLastPageHeight();}}this.resize();},pageExists:function(_206){return Boolean(this.getDefaultPageNode(_206));},measurePage:function(_207){if(this.grid.rowHeight){var _208=this.grid.rowHeight+1;return ((_207+1)*this.rowsPerPage>this.rowCount?this.rowCount-_207*this.rowsPerPage:this.rowsPerPage)*_208;}var n=this.getDefaultPageNode(_207);return (n&&n.innerHTML)?n.offsetHeight:undefined;},positionPage:function(_209,_20a){for(var i=0;i<this.colCount;i++){this.pageNodes[i][_209].style.top=_20a+"px";}},repositionPages:function(_20b){var _20c=this.getDefaultNodes();var last=0;for(var i=0;i<this.stack.length;i++){last=Math.max(this.stack[i],last);}var n=_20c[_20b];var y=(n?this.getPageNodePosition(n)+this.getPageHeight(_20b):0);for(var p=_20b+1;p<=last;p++){n=_20c[p];if(n){if(this.getPageNodePosition(n)==y){return;}this.positionPage(p,y);}y+=this.getPageHeight(p);}},installPage:function(_20d){for(var i=0;i<this.colCount;i++){this.contentNodes[i].appendChild(this.pageNodes[i][_20d]);}},preparePage:function(_20e,_20f){var p=(_20f?this.popPage():null);for(var i=0;i<this.colCount;i++){var _210=this.pageNodes[i];var _211=(p===null?this.createPageNode():this.invalidatePageNode(p,_210));_211.pageIndex=_20e;_210[_20e]=_211;}},renderPage:function(_212){var _213=[];var i,j;for(i=0;i<this.colCount;i++){_213[i]=this.pageNodes[i][_212];}for(i=0,j=_212*this.rowsPerPage;(i<this.rowsPerPage)&&(j<this.rowCount);i++,j++){this.renderRow(j,_213);}},removePage:function(_214){for(var i=0,j=_214*this.rowsPerPage;i<this.rowsPerPage;i++,j++){this.removeRow(j);}},destroyPage:function(_215){for(var i=0;i<this.colCount;i++){var n=this.invalidatePageNode(_215,this.pageNodes[i]);if(n){dojo.destroy(n);}}},pacify:function(_216){},pacifying:false,pacifyTicks:200,setPacifying:function(_217){if(this.pacifying!=_217){this.pacifying=_217;this.pacify(this.pacifying);}},startPacify:function(){this.startPacifyTicks=new Date().getTime();},doPacify:function(){var _218=(new Date().getTime()-this.startPacifyTicks)>this.pacifyTicks;this.setPacifying(true);this.startPacify();return _218;},endPacify:function(){this.setPacifying(false);},resize:function(){if(this.scrollboxNode){this.windowHeight=this.scrollboxNode.clientHeight;}for(var i=0;i<this.colCount;i++){dojox.grid.util.setStyleHeightPx(this.contentNodes[i],Math.max(1,this.height));}var _219=(!this._invalidating);if(!_219){var ah=this.grid.attr("autoHeight");if(typeof ah=="number"&&ah<=Math.min(this.rowsPerPage,this.rowCount)){_219=true;}}if(_219){this.needPage(this.page,this.pageTop);}var _21a=(this.page<this.pageCount-1)?this.rowsPerPage:((this.rowCount%this.rowsPerPage)||this.rowsPerPage);var _21b=this.getPageHeight(this.page);this.averageRowHeight=(_21b>0&&_21a>0)?(_21b/_21a):0;},calcLastPageHeight:function(){if(!this.pageCount){return 0;}var _21c=this.pageCount-1;var _21d=((this.rowCount%this.rowsPerPage)||(this.rowsPerPage))*this.defaultRowHeight;this.pageHeights[_21c]=_21d;return _21d;},updateContentHeight:function(inDh){this.height+=inDh;this.resize();},updatePageHeight:function(_21e,_21f){if(this.pageExists(_21e)){var oh=this.getPageHeight(_21e);var h=(this.measurePage(_21e));if(h===undefined){h=oh;}this.pageHeights[_21e]=h;if(oh!=h){this.updateContentHeight(h-oh);var ah=this.grid.attr("autoHeight");if((typeof ah=="number"&&ah>this.rowCount)||(ah===true&&!_21f)){this.grid.sizeChange();}else{this.repositionPages(_21e);}}return h;}return 0;},rowHeightChanged:function(_220){this.updatePageHeight(Math.floor(_220/this.rowsPerPage),false);},invalidateNodes:function(){while(this.stack.length){this.destroyPage(this.popPage());}},createPageNode:function(){var p=document.createElement("div");dojo.attr(p,"role","presentation");p.style.position="absolute";p.style[dojo._isBodyLtr()?"left":"right"]="0";return p;},getPageHeight:function(_221){var ph=this.pageHeights[_221];return (ph!==undefined?ph:this.defaultPageHeight);},pushPage:function(_222){return this.stack.push(_222);},popPage:function(){return this.stack.shift();},findPage:function(_223){var i=0,h=0;for(var ph=0;i<this.pageCount;i++,h+=ph){ph=this.getPageHeight(i);if(h+ph>=_223){break;}}this.page=i;this.pageTop=h;},buildPage:function(_224,_225,_226){this.preparePage(_224,_225);this.positionPage(_224,_226);this.installPage(_224);this.renderPage(_224);this.pushPage(_224);},needPage:function(_227,_228){var h=this.getPageHeight(_227),oh=h;if(!this.pageExists(_227)){this.buildPage(_227,this.keepPages&&(this.stack.length>=this.keepPages),_228);h=this.updatePageHeight(_227,true);}else{this.positionPage(_227,_228);}return h;},onscroll:function(){this.scroll(this.scrollboxNode.scrollTop);},scroll:function(_229){this.grid.scrollTop=_229;if(this.colCount){this.startPacify();this.findPage(_229);var h=this.height;var b=this.getScrollBottom(_229);for(var p=this.page,y=this.pageTop;(p<this.pageCount)&&((b<0)||(y<b));p++){y+=this.needPage(p,y);}this.firstVisibleRow=this.getFirstVisibleRow(this.page,this.pageTop,_229);this.lastVisibleRow=this.getLastVisibleRow(p-1,y,b);if(h!=this.height){this.repositionPages(p-1);}this.endPacify();}},getScrollBottom:function(_22a){return (this.windowHeight>=0?_22a+this.windowHeight:-1);},processNodeEvent:function(e,_22b){var t=e.target;while(t&&(t!=_22b)&&t.parentNode&&(t.parentNode.parentNode!=_22b)){t=t.parentNode;}if(!t||!t.parentNode||(t.parentNode.parentNode!=_22b)){return false;}var page=t.parentNode;e.topRowIndex=page.pageIndex*this.rowsPerPage;e.rowIndex=e.topRowIndex+_1ef(t);e.rowTarget=t;return true;},processEvent:function(e){return this.processNodeEvent(e,this.contentNode);},renderRow:function(_22c,_22d){},removeRow:function(_22e){},getDefaultPageNode:function(_22f){return this.getDefaultNodes()[_22f];},positionPageNode:function(_230,_231){},getPageNodePosition:function(_232){return _232.offsetTop;},invalidatePageNode:function(_233,_234){var p=_234[_233];if(p){delete _234[_233];this.removePage(_233,p);_1f1(p);p.innerHTML="";}return p;},getPageRow:function(_235){return _235*this.rowsPerPage;},getLastPageRow:function(_236){return Math.min(this.rowCount,this.getPageRow(_236+1))-1;},getFirstVisibleRow:function(_237,_238,_239){if(!this.pageExists(_237)){return 0;}var row=this.getPageRow(_237);var _23a=this.getDefaultNodes();var rows=_1fa(_23a[_237]);for(var i=0,l=rows.length;i<l&&_238<_239;i++,row++){_238+=rows[i].offsetHeight;}return (row?row-1:row);},getLastVisibleRow:function(_23b,_23c,_23d){if(!this.pageExists(_23b)){return 0;}var _23e=this.getDefaultNodes();var row=this.getLastPageRow(_23b);var rows=_1fa(_23e[_23b]);for(var i=rows.length-1;i>=0&&_23c>_23d;i--,row--){_23c-=rows[i].offsetHeight;}return row+1;},findTopRow:function(_23f){var _240=this.getDefaultNodes();var rows=_1fa(_240[this.page]);for(var i=0,l=rows.length,t=this.pageTop,h;i<l;i++){h=rows[i].offsetHeight;t+=h;if(t>=_23f){this.offset=h-(t-_23f);return i+this.page*this.rowsPerPage;}}return -1;},findScrollTop:function(_241){var _242=Math.floor(_241/this.rowsPerPage);var t=0;var i,l;for(i=0;i<_242;i++){t+=this.getPageHeight(i);}this.pageTop=t;this.needPage(_242,this.pageTop);var _243=this.getDefaultNodes();var rows=_1fa(_243[_242]);var r=_241-this.rowsPerPage*_242;for(i=0,l=rows.length;i<l&&i<r;i++){t+=rows[i].offsetHeight;}return t;},dummy:0});})();}if(!dojo._hasResource["dojox.grid.cells._base"]){dojo._hasResource["dojox.grid.cells._base"]=true;dojo.provide("dojox.grid.cells._base");dojo.declare("dojox.grid._DeferredTextWidget",dijit._Widget,{deferred:null,_destroyOnRemove:true,postCreate:function(){if(this.deferred){this.deferred.addBoth(dojo.hitch(this,function(text){if(this.domNode){this.domNode.innerHTML=text;}}));}}});(function(){var _244=function(_245){try{dojox.grid.util.fire(_245,"focus");dojox.grid.util.fire(_245,"select");}catch(e){}};var _246=function(){setTimeout(dojo.hitch.apply(dojo,arguments),0);};var dgc=dojox.grid.cells;dojo.declare("dojox.grid.cells._Base",null,{styles:"",classes:"",editable:false,alwaysEditing:false,formatter:null,defaultValue:"...",value:null,hidden:false,noresize:false,draggable:true,_valueProp:"value",_formatPending:false,constructor:function(_247){this._props=_247||{};dojo.mixin(this,_247);if(this.draggable===undefined){this.draggable=true;}},_defaultFormat:function(_248,_249){var s=this.grid.formatterScope||this;var f=this.formatter;if(f&&s&&typeof f=="string"){f=this.formatter=s[f];}var v=(_248!=this.defaultValue&&f)?f.apply(s,_249):_248;if(typeof v=="undefined"){return this.defaultValue;}if(v&&v.addBoth){v=new dojox.grid._DeferredTextWidget({deferred:v},dojo.create("span",{innerHTML:this.defaultValue}));}if(v&&v.declaredClass&&v.startup){return "<div class='dojoxGridStubNode' linkWidget='"+v.id+"' cellIdx='"+this.index+"'>"+this.defaultValue+"</div>";}return v;},format:function(_24a,_24b){var f,i=this.grid.edit.info,d=this.get?this.get(_24a,_24b):(this.value||this.defaultValue);d=(d&&d.replace&&this.grid.escapeHTMLInData)?d.replace(/&/g,"&amp;").replace(/</g,"&lt;"):d;if(this.editable&&(this.alwaysEditing||(i.rowIndex==_24a&&i.cell==this))){return this.formatEditing(d,_24a);}else{return this._defaultFormat(d,[d,_24a,this]);}},formatEditing:function(_24c,_24d){},getNode:function(_24e){return this.view.getCellNode(_24e,this.index);},getHeaderNode:function(){return this.view.getHeaderCellNode(this.index);},getEditNode:function(_24f){return (this.getNode(_24f)||0).firstChild||0;},canResize:function(){var uw=this.unitWidth;return uw&&(uw!=="auto");},isFlex:function(){var uw=this.unitWidth;return uw&&dojo.isString(uw)&&(uw=="auto"||uw.slice(-1)=="%");},applyEdit:function(_250,_251){this.grid.edit.applyCellEdit(_250,this,_251);},cancelEdit:function(_252){this.grid.doCancelEdit(_252);},_onEditBlur:function(_253){if(this.grid.edit.isEditCell(_253,this.index)){this.grid.edit.apply();}},registerOnBlur:function(_254,_255){if(this.commitOnBlur){dojo.connect(_254,"onblur",function(e){setTimeout(dojo.hitch(this,"_onEditBlur",_255),250);});}},needFormatNode:function(_256,_257){this._formatPending=true;_246(this,"_formatNode",_256,_257);},cancelFormatNode:function(){this._formatPending=false;},_formatNode:function(_258,_259){if(this._formatPending){this._formatPending=false;dojo.setSelectable(this.grid.domNode,true);this.formatNode(this.getEditNode(_259),_258,_259);}},formatNode:function(_25a,_25b,_25c){if(dojo.isIE){_246(this,"focus",_25c,_25a);}else{this.focus(_25c,_25a);}},dispatchEvent:function(m,e){if(m in this){return this[m](e);}},getValue:function(_25d){return this.getEditNode(_25d)[this._valueProp];},setValue:function(_25e,_25f){var n=this.getEditNode(_25e);if(n){n[this._valueProp]=_25f;}},focus:function(_260,_261){_244(_261||this.getEditNode(_260));},save:function(_262){this.value=this.value||this.getValue(_262);},restore:function(_263){this.setValue(_263,this.value);},_finish:function(_264){dojo.setSelectable(this.grid.domNode,false);this.cancelFormatNode();},apply:function(_265){this.applyEdit(this.getValue(_265),_265);this._finish(_265);},cancel:function(_266){this.cancelEdit(_266);this._finish(_266);}});dgc._Base.markupFactory=function(node,_267){var d=dojo;var _268=d.trim(d.attr(node,"formatter")||"");if(_268){_267.formatter=dojo.getObject(_268)||_268;}var get=d.trim(d.attr(node,"get")||"");if(get){_267.get=dojo.getObject(get);}var _269=function(attr,cell,_26a){var _26b=d.trim(d.attr(node,attr)||"");if(_26b){cell[_26a||attr]=!(_26b.toLowerCase()=="false");}};_269("sortDesc",_267);_269("editable",_267);_269("alwaysEditing",_267);_269("noresize",_267);_269("draggable",_267);var _26c=d.trim(d.attr(node,"loadingText")||d.attr(node,"defaultValue")||"");if(_26c){_267.defaultValue=_26c;}var _26d=function(attr,cell,_26e){var _26f=d.trim(d.attr(node,attr)||"")||undefined;if(_26f){cell[_26e||attr]=_26f;}};_26d("styles",_267);_26d("headerStyles",_267);_26d("cellStyles",_267);_26d("classes",_267);_26d("headerClasses",_267);_26d("cellClasses",_267);};dojo.declare("dojox.grid.cells.Cell",dgc._Base,{constructor:function(){this.keyFilter=this.keyFilter;},keyFilter:null,formatEditing:function(_270,_271){this.needFormatNode(_270,_271);return "<input class=\"dojoxGridInput\" type=\"text\" value=\""+_270+"\">";},formatNode:function(_272,_273,_274){this.inherited(arguments);this.registerOnBlur(_272,_274);},doKey:function(e){if(this.keyFilter){var key=String.fromCharCode(e.charCode);if(key.search(this.keyFilter)==-1){dojo.stopEvent(e);}}},_finish:function(_275){this.inherited(arguments);var n=this.getEditNode(_275);try{dojox.grid.util.fire(n,"blur");}catch(e){}}});dgc.Cell.markupFactory=function(node,_276){dgc._Base.markupFactory(node,_276);var d=dojo;var _277=d.trim(d.attr(node,"keyFilter")||"");if(_277){_276.keyFilter=new RegExp(_277);}};dojo.declare("dojox.grid.cells.RowIndex",dgc.Cell,{name:"Row",postscript:function(){this.editable=false;},get:function(_278){return _278+1;}});dgc.RowIndex.markupFactory=function(node,_279){dgc.Cell.markupFactory(node,_279);};dojo.declare("dojox.grid.cells.Select",dgc.Cell,{options:null,values:null,returnIndex:-1,constructor:function(_27a){this.values=this.values||this.options;},formatEditing:function(_27b,_27c){this.needFormatNode(_27b,_27c);var h=["<select class=\"dojoxGridSelect\">"];for(var i=0,o,v;((o=this.options[i])!==undefined)&&((v=this.values[i])!==undefined);i++){h.push("<option",(_27b==v?" selected":"")," value=\""+v+"\"",">",o,"</option>");}h.push("</select>");return h.join("");},getValue:function(_27d){var n=this.getEditNode(_27d);if(n){var i=n.selectedIndex,o=n.options[i];return this.returnIndex>-1?i:o.value||o.innerHTML;}}});dgc.Select.markupFactory=function(node,cell){dgc.Cell.markupFactory(node,cell);var d=dojo;var _27e=d.trim(d.attr(node,"options")||"");if(_27e){var o=_27e.split(",");if(o[0]!=_27e){cell.options=o;}}var _27f=d.trim(d.attr(node,"values")||"");if(_27f){var v=_27f.split(",");if(v[0]!=_27f){cell.values=v;}}};dojo.declare("dojox.grid.cells.AlwaysEdit",dgc.Cell,{alwaysEditing:true,_formatNode:function(_280,_281){this.formatNode(this.getEditNode(_281),_280,_281);},applyStaticValue:function(_282){var e=this.grid.edit;e.applyCellEdit(this.getValue(_282),this,_282);e.start(this,_282,true);}});dgc.AlwaysEdit.markupFactory=function(node,cell){dgc.Cell.markupFactory(node,cell);};dojo.declare("dojox.grid.cells.Bool",dgc.AlwaysEdit,{_valueProp:"checked",formatEditing:function(_283,_284){return "<input class=\"dojoxGridInput\" type=\"checkbox\""+(_283?" checked=\"checked\"":"")+" style=\"width: auto\" />";},doclick:function(e){if(e.target.tagName=="INPUT"){this.applyStaticValue(e.rowIndex);}}});dgc.Bool.markupFactory=function(node,cell){dgc.AlwaysEdit.markupFactory(node,cell);};})();}if(!dojo._hasResource["dojox.grid.cells"]){dojo._hasResource["dojox.grid.cells"]=true;dojo.provide("dojox.grid.cells");}if(!dojo._hasResource["dojo.dnd.common"]){dojo._hasResource["dojo.dnd.common"]=true;dojo.provide("dojo.dnd.common");dojo.dnd.getCopyKeyState=dojo.isCopyKeyPressed;dojo.dnd._uniqueId=0;dojo.dnd.getUniqueId=function(){var id;do{id=dojo._scopeName+"Unique"+(++dojo.dnd._uniqueId);}while(dojo.byId(id));return id;};dojo.dnd._empty={};dojo.dnd.isFormElement=function(e){var t=e.target;if(t.nodeType==3){t=t.parentNode;}return " button textarea input select option ".indexOf(" "+t.tagName.toLowerCase()+" ")>=0;};}if(!dojo._hasResource["dojo.dnd.autoscroll"]){dojo._hasResource["dojo.dnd.autoscroll"]=true;dojo.provide("dojo.dnd.autoscroll");dojo.dnd.getViewport=function(){var d=dojo.doc,dd=d.documentElement,w=window,b=dojo.body();if(dojo.isMozilla){return {w:dd.clientWidth,h:w.innerHeight};}else{if(!dojo.isOpera&&w.innerWidth){return {w:w.innerWidth,h:w.innerHeight};}else{if(!dojo.isOpera&&dd&&dd.clientWidth){return {w:dd.clientWidth,h:dd.clientHeight};}else{if(b.clientWidth){return {w:b.clientWidth,h:b.clientHeight};}}}}return null;};dojo.dnd.V_TRIGGER_AUTOSCROLL=32;dojo.dnd.H_TRIGGER_AUTOSCROLL=32;dojo.dnd.V_AUTOSCROLL_VALUE=16;dojo.dnd.H_AUTOSCROLL_VALUE=16;dojo.dnd.autoScroll=function(e){var v=dojo.dnd.getViewport(),dx=0,dy=0;if(e.clientX<dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=-dojo.dnd.H_AUTOSCROLL_VALUE;}else{if(e.clientX>v.w-dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=dojo.dnd.H_AUTOSCROLL_VALUE;}}if(e.clientY<dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=-dojo.dnd.V_AUTOSCROLL_VALUE;}else{if(e.clientY>v.h-dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=dojo.dnd.V_AUTOSCROLL_VALUE;}}window.scrollBy(dx,dy);};dojo.dnd._validNodes={"div":1,"p":1,"td":1};dojo.dnd._validOverflow={"auto":1,"scroll":1};dojo.dnd.autoScrollNodes=function(e){for(var n=e.target;n;){if(n.nodeType==1&&(n.tagName.toLowerCase() in dojo.dnd._validNodes)){var s=dojo.getComputedStyle(n);if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){var b=dojo._getContentBox(n,s),t=dojo.position(n,true);var w=Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL,b.w/2),h=Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL,b.h/2),rx=e.pageX-t.x,ry=e.pageY-t.y,dx=0,dy=0;if(dojo.isWebKit||dojo.isOpera){rx+=dojo.body().scrollLeft,ry+=dojo.body().scrollTop;}if(rx>0&&rx<b.w){if(rx<w){dx=-w;}else{if(rx>b.w-w){dx=w;}}}if(ry>0&&ry<b.h){if(ry<h){dy=-h;}else{if(ry>b.h-h){dy=h;}}}var _285=n.scrollLeft,_286=n.scrollTop;n.scrollLeft=n.scrollLeft+dx;n.scrollTop=n.scrollTop+dy;if(_285!=n.scrollLeft||_286!=n.scrollTop){return;}}}try{n=n.parentNode;}catch(x){n=null;}}dojo.dnd.autoScroll(e);};}if(!dojo._hasResource["dojo.dnd.Mover"]){dojo._hasResource["dojo.dnd.Mover"]=true;dojo.provide("dojo.dnd.Mover");dojo.declare("dojo.dnd.Mover",null,{constructor:function(node,e,host){this.node=dojo.byId(node);this.marginBox={l:e.pageX,t:e.pageY};this.mouseButton=e.button;var h=this.host=host,d=node.ownerDocument,_287=dojo.connect(d,"onmousemove",this,"onFirstMove");this.events=[dojo.connect(d,"onmousemove",this,"onMouseMove"),dojo.connect(d,"onmouseup",this,"onMouseUp"),dojo.connect(d,"ondragstart",dojo.stopEvent),dojo.connect(d.body,"onselectstart",dojo.stopEvent),_287];if(h&&h.onMoveStart){h.onMoveStart(this);}},onMouseMove:function(e){dojo.dnd.autoScroll(e);var m=this.marginBox;this.host.onMove(this,{l:m.l+e.pageX,t:m.t+e.pageY});dojo.stopEvent(e);},onMouseUp:function(e){if(dojo.isWebKit&&dojo.isMac&&this.mouseButton==2?e.button==0:this.mouseButton==e.button){this.destroy();}dojo.stopEvent(e);},onFirstMove:function(){var s=this.node.style,l,t,h=this.host;switch(s.position){case "relative":case "absolute":l=Math.round(parseFloat(s.left));t=Math.round(parseFloat(s.top));break;default:s.position="absolute";var m=dojo.marginBox(this.node);var b=dojo.doc.body;var bs=dojo.getComputedStyle(b);var bm=dojo._getMarginBox(b,bs);var bc=dojo._getContentBox(b,bs);l=m.l-(bc.l-bm.l);t=m.t-(bc.t-bm.t);break;}this.marginBox.l=l-this.marginBox.l;this.marginBox.t=t-this.marginBox.t;if(h&&h.onFirstMove){h.onFirstMove(this);}dojo.disconnect(this.events.pop());},destroy:function(){dojo.forEach(this.events,dojo.disconnect);var h=this.host;if(h&&h.onMoveStop){h.onMoveStop(this);}this.events=this.node=this.host=null;}});}if(!dojo._hasResource["dojo.dnd.Moveable"]){dojo._hasResource["dojo.dnd.Moveable"]=true;dojo.provide("dojo.dnd.Moveable");dojo.declare("dojo.dnd.Moveable",null,{handle:"",delay:0,skip:false,constructor:function(node,_288){this.node=dojo.byId(node);if(!_288){_288={};}this.handle=_288.handle?dojo.byId(_288.handle):null;if(!this.handle){this.handle=this.node;}this.delay=_288.delay>0?_288.delay:0;this.skip=_288.skip;this.mover=_288.mover?_288.mover:dojo.dnd.Mover;this.events=[dojo.connect(this.handle,"onmousedown",this,"onMouseDown"),dojo.connect(this.handle,"ondragstart",this,"onSelectStart"),dojo.connect(this.handle,"onselectstart",this,"onSelectStart")];},markupFactory:function(_289,node){return new dojo.dnd.Moveable(node,_289);},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.events=this.node=this.handle=null;},onMouseDown:function(e){if(this.skip&&dojo.dnd.isFormElement(e)){return;}if(this.delay){this.events.push(dojo.connect(this.handle,"onmousemove",this,"onMouseMove"),dojo.connect(this.handle,"onmouseup",this,"onMouseUp"));this._lastX=e.pageX;this._lastY=e.pageY;}else{this.onDragDetected(e);}dojo.stopEvent(e);},onMouseMove:function(e){if(Math.abs(e.pageX-this._lastX)>this.delay||Math.abs(e.pageY-this._lastY)>this.delay){this.onMouseUp(e);this.onDragDetected(e);}dojo.stopEvent(e);},onMouseUp:function(e){for(var i=0;i<2;++i){dojo.disconnect(this.events.pop());}dojo.stopEvent(e);},onSelectStart:function(e){if(!this.skip||!dojo.dnd.isFormElement(e)){dojo.stopEvent(e);}},onDragDetected:function(e){new this.mover(this.node,e,this);},onMoveStart:function(_28a){dojo.publish("/dnd/move/start",[_28a]);dojo.addClass(dojo.body(),"dojoMove");dojo.addClass(this.node,"dojoMoveItem");},onMoveStop:function(_28b){dojo.publish("/dnd/move/stop",[_28b]);dojo.removeClass(dojo.body(),"dojoMove");dojo.removeClass(this.node,"dojoMoveItem");},onFirstMove:function(_28c){},onMove:function(_28d,_28e){this.onMoving(_28d,_28e);var s=_28d.node.style;s.left=_28e.l+"px";s.top=_28e.t+"px";this.onMoved(_28d,_28e);},onMoving:function(_28f,_290){},onMoved:function(_291,_292){}});}if(!dojo._hasResource["dojox.grid._Builder"]){dojo._hasResource["dojox.grid._Builder"]=true;dojo.provide("dojox.grid._Builder");(function(){var dg=dojox.grid;var _293=function(td){return td.cellIndex>=0?td.cellIndex:dojo.indexOf(td.parentNode.cells,td);};var _294=function(tr){return tr.rowIndex>=0?tr.rowIndex:dojo.indexOf(tr.parentNode.childNodes,tr);};var _295=function(_296,_297){return _296&&((_296.rows||0)[_297]||_296.childNodes[_297]);};var _298=function(node){for(var n=node;n&&n.tagName!="TABLE";n=n.parentNode){}return n;};var _299=function(_29a,_29b){for(var n=_29a;n&&_29b(n);n=n.parentNode){}return n;};var _29c=function(_29d){var name=_29d.toUpperCase();return function(node){return node.tagName!=name;};};var _29e=dojox.grid.util.rowIndexTag;var _29f=dojox.grid.util.gridViewTag;dg._Builder=dojo.extend(function(view){if(view){this.view=view;this.grid=view.grid;}},{view:null,_table:"<table class=\"dojoxGridRowTable\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" role=\"presentation\"",getTableArray:function(){var html=[this._table];if(this.view.viewWidth){html.push([" style=\"width:",this.view.viewWidth,";\""].join(""));}html.push(">");return html;},generateCellMarkup:function(_2a0,_2a1,_2a2,_2a3){var _2a4=[],html;if(_2a3){var _2a5=_2a0.index!=_2a0.grid.getSortIndex()?"":_2a0.grid.sortInfo>0?"aria-sort=\"ascending\"":"aria-sort=\"descending\"";if(!_2a0.id){_2a0.id=this.grid.id+"Hdr"+_2a0.index;}html=["<th tabIndex=\"-1\" aria-readonly=\"true\" role=\"columnheader\"",_2a5,"id=\"",_2a0.id,"\""];}else{var _2a6=this.grid.editable&&!_2a0.editable?"aria-readonly=\"true\"":"";html=["<td tabIndex=\"-1\" role=\"gridcell\"",_2a6];}if(_2a0.colSpan){html.push(" colspan=\"",_2a0.colSpan,"\"");}if(_2a0.rowSpan){html.push(" rowspan=\"",_2a0.rowSpan,"\"");}html.push(" class=\"dojoxGridCell ");if(_2a0.classes){html.push(_2a0.classes," ");}if(_2a2){html.push(_2a2," ");}_2a4.push(html.join(""));_2a4.push("");html=["\" idx=\"",_2a0.index,"\" style=\""];if(_2a1&&_2a1[_2a1.length-1]!=";"){_2a1+=";";}html.push(_2a0.styles,_2a1||"",_2a0.hidden?"display:none;":"");if(_2a0.unitWidth){html.push("width:",_2a0.unitWidth,";");}_2a4.push(html.join(""));_2a4.push("");html=["\""];if(_2a0.attrs){html.push(" ",_2a0.attrs);}html.push(">");_2a4.push(html.join(""));_2a4.push("");_2a4.push(_2a3?"</th>":"</td>");return _2a4;},isCellNode:function(_2a7){return Boolean(_2a7&&_2a7!=dojo.doc&&dojo.attr(_2a7,"idx"));},getCellNodeIndex:function(_2a8){return _2a8?Number(dojo.attr(_2a8,"idx")):-1;},getCellNode:function(_2a9,_2aa){for(var i=0,row;(row=_295(_2a9.firstChild,i));i++){for(var j=0,cell;(cell=row.cells[j]);j++){if(this.getCellNodeIndex(cell)==_2aa){return cell;}}}return null;},findCellTarget:function(_2ab,_2ac){var n=_2ab;while(n&&(!this.isCellNode(n)||(n.offsetParent&&_29f in n.offsetParent.parentNode&&n.offsetParent.parentNode[_29f]!=this.view.id))&&(n!=_2ac)){n=n.parentNode;}return n!=_2ac?n:null;},baseDecorateEvent:function(e){e.dispatch="do"+e.type;e.grid=this.grid;e.sourceView=this.view;e.cellNode=this.findCellTarget(e.target,e.rowNode);e.cellIndex=this.getCellNodeIndex(e.cellNode);e.cell=(e.cellIndex>=0?this.grid.getCell(e.cellIndex):null);},findTarget:function(_2ad,_2ae){var n=_2ad;while(n&&(n!=this.domNode)&&(!(_2ae in n)||(_29f in n&&n[_29f]!=this.view.id))){n=n.parentNode;}return (n!=this.domNode)?n:null;},findRowTarget:function(_2af){return this.findTarget(_2af,_29e);},isIntraNodeEvent:function(e){try{return (e.cellNode&&e.relatedTarget&&dojo.isDescendant(e.relatedTarget,e.cellNode));}catch(x){return false;}},isIntraRowEvent:function(e){try{var row=e.relatedTarget&&this.findRowTarget(e.relatedTarget);return !row&&(e.rowIndex==-1)||row&&(e.rowIndex==row.gridRowIndex);}catch(x){return false;}},dispatchEvent:function(e){if(e.dispatch in this){return this[e.dispatch](e);}return false;},domouseover:function(e){if(e.cellNode&&(e.cellNode!=this.lastOverCellNode)){this.lastOverCellNode=e.cellNode;this.grid.onMouseOver(e);}this.grid.onMouseOverRow(e);},domouseout:function(e){if(e.cellNode&&(e.cellNode==this.lastOverCellNode)&&!this.isIntraNodeEvent(e,this.lastOverCellNode)){this.lastOverCellNode=null;this.grid.onMouseOut(e);if(!this.isIntraRowEvent(e)){this.grid.onMouseOutRow(e);}}},domousedown:function(e){if(e.cellNode){this.grid.onMouseDown(e);}this.grid.onMouseDownRow(e);}});dg._ContentBuilder=dojo.extend(function(view){dg._Builder.call(this,view);},dg._Builder.prototype,{update:function(){this.prepareHtml();},prepareHtml:function(){var _2b0=this.grid.get,_2b1=this.view.structure.cells;for(var j=0,row;(row=_2b1[j]);j++){for(var i=0,cell;(cell=row[i]);i++){cell.get=cell.get||(cell.value==undefined)&&_2b0;cell.markup=this.generateCellMarkup(cell,cell.cellStyles,cell.cellClasses,false);if(!this.grid.editable&&cell.editable){this.grid.editable=true;}}}},generateHtml:function(_2b2,_2b3){var html=this.getTableArray(),v=this.view,_2b4=v.structure.cells,item=this.grid.getItem(_2b3);dojox.grid.util.fire(this.view,"onBeforeRow",[_2b3,_2b4]);for(var j=0,row;(row=_2b4[j]);j++){if(row.hidden||row.header){continue;}html.push(!row.invisible?"<tr>":"<tr class=\"dojoxGridInvisible\">");for(var i=0,cell,m,cc,cs;(cell=row[i]);i++){m=cell.markup;cc=cell.customClasses=[];cs=cell.customStyles=[];m[5]=cell.format(_2b3,item);m[1]=cc.join(" ");m[3]=cs.join(";");html.push.apply(html,m);}html.push("</tr>");}html.push("</table>");return html.join("");},decorateEvent:function(e){e.rowNode=this.findRowTarget(e.target);if(!e.rowNode){return false;}e.rowIndex=e.rowNode[_29e];this.baseDecorateEvent(e);e.cell=this.grid.getCell(e.cellIndex);return true;}});dg._HeaderBuilder=dojo.extend(function(view){this.moveable=null;dg._Builder.call(this,view);},dg._Builder.prototype,{_skipBogusClicks:false,overResizeWidth:4,minColWidth:1,update:function(){if(this.tableMap){this.tableMap.mapRows(this.view.structure.cells);}else{this.tableMap=new dg._TableMap(this.view.structure.cells);}},generateHtml:function(_2b5,_2b6){var html=this.getTableArray(),_2b7=this.view.structure.cells;dojox.grid.util.fire(this.view,"onBeforeRow",[-1,_2b7]);for(var j=0,row;(row=_2b7[j]);j++){if(row.hidden){continue;}html.push(!row.invisible?"<tr>":"<tr class=\"dojoxGridInvisible\">");for(var i=0,cell,_2b8;(cell=row[i]);i++){cell.customClasses=[];cell.customStyles=[];if(this.view.simpleStructure){if(cell.draggable){if(cell.headerClasses){if(cell.headerClasses.indexOf("dojoDndItem")==-1){cell.headerClasses+=" dojoDndItem";}}else{cell.headerClasses="dojoDndItem";}}if(cell.attrs){if(cell.attrs.indexOf("dndType='gridColumn_")==-1){cell.attrs+=" dndType='gridColumn_"+this.grid.id+"'";}}else{cell.attrs="dndType='gridColumn_"+this.grid.id+"'";}}_2b8=this.generateCellMarkup(cell,cell.headerStyles,cell.headerClasses,true);_2b8[5]=(_2b6!=undefined?_2b6:_2b5(cell));_2b8[3]=cell.customStyles.join(";");_2b8[1]=cell.customClasses.join(" ");html.push(_2b8.join(""));}html.push("</tr>");}html.push("</table>");return html.join("");},getCellX:function(e){var n,x=e.layerX;if(dojo.isMoz){n=_299(e.target,_29c("th"));x-=(n&&n.offsetLeft)||0;var t=e.sourceView.getScrollbarWidth();if(!dojo._isBodyLtr()&&e.sourceView.headerNode.scrollLeft<t){x-=t;}}n=_299(e.target,function(){if(!n||n==e.cellNode){return false;}x+=(n.offsetLeft<0?0:n.offsetLeft);return true;});return x;},decorateEvent:function(e){this.baseDecorateEvent(e);e.rowIndex=-1;e.cellX=this.getCellX(e);return true;},prepareResize:function(e,mod){do{var i=_293(e.cellNode);e.cellNode=(i?e.cellNode.parentNode.cells[i+mod]:null);e.cellIndex=(e.cellNode?this.getCellNodeIndex(e.cellNode):-1);}while(e.cellNode&&e.cellNode.style.display=="none");return Boolean(e.cellNode);},canResize:function(e){if(!e.cellNode||e.cellNode.colSpan>1){return false;}var cell=this.grid.getCell(e.cellIndex);return !cell.noresize&&cell.canResize();},overLeftResizeArea:function(e){if(dojo.hasClass(dojo.body(),"dojoDndMove")){return false;}if(dojo.isIE){var tN=e.target;if(dojo.hasClass(tN,"dojoxGridArrowButtonNode")||dojo.hasClass(tN,"dojoxGridArrowButtonChar")){return false;}}if(dojo._isBodyLtr()){return (e.cellIndex>0)&&(e.cellX<this.overResizeWidth)&&this.prepareResize(e,-1);}var t=e.cellNode&&(e.cellX<this.overResizeWidth);return t;},overRightResizeArea:function(e){if(dojo.hasClass(dojo.body(),"dojoDndMove")){return false;}if(dojo.isIE){var tN=e.target;if(dojo.hasClass(tN,"dojoxGridArrowButtonNode")||dojo.hasClass(tN,"dojoxGridArrowButtonChar")){return false;}}if(dojo._isBodyLtr()){return e.cellNode&&(e.cellX>=e.cellNode.offsetWidth-this.overResizeWidth);}return (e.cellIndex>0)&&(e.cellX>=e.cellNode.offsetWidth-this.overResizeWidth)&&this.prepareResize(e,-1);},domousemove:function(e){if(!this.moveable){var c=(this.overRightResizeArea(e)?"dojoxGridColResize":(this.overLeftResizeArea(e)?"dojoxGridColResize":""));if(c&&!this.canResize(e)){c="dojoxGridColNoResize";}dojo.toggleClass(e.sourceView.headerNode,"dojoxGridColNoResize",(c=="dojoxGridColNoResize"));dojo.toggleClass(e.sourceView.headerNode,"dojoxGridColResize",(c=="dojoxGridColResize"));if(dojo.isIE){var t=e.sourceView.headerNode.scrollLeft;e.sourceView.headerNode.scrollLeft=t;}if(c){dojo.stopEvent(e);}}},domousedown:function(e){if(!this.moveable){if((this.overRightResizeArea(e)||this.overLeftResizeArea(e))&&this.canResize(e)){this.beginColumnResize(e);}else{this.grid.onMouseDown(e);this.grid.onMouseOverRow(e);}}},doclick:function(e){if(this._skipBogusClicks){dojo.stopEvent(e);return true;}return false;},colResizeSetup:function(e,_2b9){var _2ba=dojo.contentBox(e.sourceView.headerNode);if(_2b9){this.lineDiv=document.createElement("div");var vw=(dojo.position||dojo._abs)(e.sourceView.headerNode,true);var _2bb=dojo.contentBox(e.sourceView.domNode);dojo.style(this.lineDiv,{top:vw.y+"px",left:e.clientX+"px",height:(_2bb.h+_2ba.h)+"px"});dojo.addClass(this.lineDiv,"dojoxGridResizeColLine");this.lineDiv._origLeft=e.clientX;dojo.body().appendChild(this.lineDiv);}var _2bc=[],_2bd=this.tableMap.findOverlappingNodes(e.cellNode);for(var i=0,cell;(cell=_2bd[i]);i++){_2bc.push({node:cell,index:this.getCellNodeIndex(cell),width:cell.offsetWidth});}var view=e.sourceView;var adj=dojo._isBodyLtr()?1:-1;var _2be=e.grid.views.views;var _2bf=[];for(var j=view.idx+adj,_2c0;(_2c0=_2be[j]);j=j+adj){_2bf.push({node:_2c0.headerNode,left:window.parseInt(_2c0.headerNode.style.left)});}var _2c1=view.headerContentNode.firstChild;var drag={scrollLeft:e.sourceView.headerNode.scrollLeft,view:view,node:e.cellNode,index:e.cellIndex,w:dojo.contentBox(e.cellNode).w,vw:_2ba.w,table:_2c1,tw:dojo.contentBox(_2c1).w,spanners:_2bc,followers:_2bf};return drag;},beginColumnResize:function(e){this.moverDiv=document.createElement("div");dojo.style(this.moverDiv,{position:"absolute",left:0});dojo.body().appendChild(this.moverDiv);dojo.addClass(this.grid.domNode,"dojoxGridColumnResizing");var m=(this.moveable=new dojo.dnd.Moveable(this.moverDiv));var drag=this.colResizeSetup(e,true);m.onMove=dojo.hitch(this,"doResizeColumn",drag);dojo.connect(m,"onMoveStop",dojo.hitch(this,function(){this.endResizeColumn(drag);if(drag.node.releaseCapture){drag.node.releaseCapture();}this.moveable.destroy();delete this.moveable;this.moveable=null;dojo.removeClass(this.grid.domNode,"dojoxGridColumnResizing");}));if(e.cellNode.setCapture){e.cellNode.setCapture();}m.onMouseDown(e);},doResizeColumn:function(_2c2,_2c3,_2c4){var _2c5=_2c4.l;var data={deltaX:_2c5,w:_2c2.w+_2c5,vw:_2c2.vw+_2c5,tw:_2c2.tw+_2c5};this.dragRecord={inDrag:_2c2,mover:_2c3,leftTop:_2c4};if(data.w>=this.minColWidth){if(!_2c3){this.doResizeNow(_2c2,data);}else{dojo.style(this.lineDiv,"left",(this.lineDiv._origLeft+data.deltaX)+"px");}}},endResizeColumn:function(_2c6){if(this.dragRecord){var _2c7=this.dragRecord.leftTop;var _2c8=dojo._isBodyLtr()?_2c7.l:-_2c7.l;_2c8+=Math.max(_2c6.w+_2c8,this.minColWidth)-(_2c6.w+_2c8);if(dojo.isWebKit&&_2c6.spanners.length){_2c8+=dojo._getPadBorderExtents(_2c6.spanners[0].node).w;}var data={deltaX:_2c8,w:_2c6.w+_2c8,vw:_2c6.vw+_2c8,tw:_2c6.tw+_2c8};this.doResizeNow(_2c6,data);}dojo.destroy(this.lineDiv);dojo.destroy(this.moverDiv);dojo.destroy(this.moverDiv);delete this.moverDiv;this._skipBogusClicks=true;_2c6.view.update();this._skipBogusClicks=false;this.grid.onResizeColumn(_2c6.index);},doResizeNow:function(_2c9,data){_2c9.view.convertColPctToFixed();if(_2c9.view.flexCells&&!_2c9.view.testFlexCells()){var t=_298(_2c9.node);if(t){(t.style.width="");}}var i,s,sw,f,fl;for(i=0;(s=_2c9.spanners[i]);i++){sw=s.width+data.deltaX;s.node.style.width=sw+"px";_2c9.view.setColWidth(s.index,sw);}for(i=0;(f=_2c9.followers[i]);i++){fl=f.left+data.deltaX;f.node.style.left=fl+"px";}_2c9.node.style.width=data.w+"px";_2c9.view.setColWidth(_2c9.index,data.w);_2c9.view.headerNode.style.width=data.vw+"px";_2c9.view.setColumnsWidth(data.tw);if(!dojo._isBodyLtr()){_2c9.view.headerNode.scrollLeft=_2c9.scrollLeft+data.deltaX;}}});dg._TableMap=dojo.extend(function(rows){this.mapRows(rows);},{map:null,mapRows:function(_2ca){var _2cb=_2ca.length;if(!_2cb){return;}this.map=[];var row;for(var k=0;(row=_2ca[k]);k++){this.map[k]=[];}for(var j=0;(row=_2ca[j]);j++){for(var i=0,x=0,cell,_2cc,_2cd;(cell=row[i]);i++){while(this.map[j][x]){x++;}this.map[j][x]={c:i,r:j};_2cd=cell.rowSpan||1;_2cc=cell.colSpan||1;for(var y=0;y<_2cd;y++){for(var s=0;s<_2cc;s++){this.map[j+y][x+s]=this.map[j][x];}}x+=_2cc;}}},dumpMap:function(){for(var j=0,row,h="";(row=this.map[j]);j++,h=""){for(var i=0,cell;(cell=row[i]);i++){h+=cell.r+","+cell.c+"   ";}}},getMapCoords:function(_2ce,_2cf){for(var j=0,row;(row=this.map[j]);j++){for(var i=0,cell;(cell=row[i]);i++){if(cell.c==_2cf&&cell.r==_2ce){return {j:j,i:i};}}}return {j:-1,i:-1};},getNode:function(_2d0,_2d1,_2d2){var row=_2d0&&_2d0.rows[_2d1];return row&&row.cells[_2d2];},_findOverlappingNodes:function(_2d3,_2d4,_2d5){var _2d6=[];var m=this.getMapCoords(_2d4,_2d5);for(var j=0,row;(row=this.map[j]);j++){if(j==m.j){continue;}var rw=row[m.i];var n=(rw?this.getNode(_2d3,rw.r,rw.c):null);if(n){_2d6.push(n);}}return _2d6;},findOverlappingNodes:function(_2d7){return this._findOverlappingNodes(_298(_2d7),_294(_2d7.parentNode),_293(_2d7));}});})();}if(!dojo._hasResource["dojo.dnd.Container"]){dojo._hasResource["dojo.dnd.Container"]=true;dojo.provide("dojo.dnd.Container");dojo.declare("dojo.dnd.Container",null,{skipForm:false,constructor:function(node,_2d8){this.node=dojo.byId(node);if(!_2d8){_2d8={};}this.creator=_2d8.creator||null;this.skipForm=_2d8.skipForm;this.parent=_2d8.dropParent&&dojo.byId(_2d8.dropParent);this.map={};this.current=null;this.containerState="";dojo.addClass(this.node,"dojoDndContainer");if(!(_2d8&&_2d8._skipStartup)){this.startup();}this.events=[dojo.connect(this.node,"onmouseover",this,"onMouseOver"),dojo.connect(this.node,"onmouseout",this,"onMouseOut"),dojo.connect(this.node,"ondragstart",this,"onSelectStart"),dojo.connect(this.node,"onselectstart",this,"onSelectStart")];},creator:function(){},getItem:function(key){return this.map[key];},setItem:function(key,data){this.map[key]=data;},delItem:function(key){delete this.map[key];},forInItems:function(f,o){o=o||dojo.global;var m=this.map,e=dojo.dnd._empty;for(var i in m){if(i in e){continue;}f.call(o,m[i],i,this);}return o;},clearItems:function(){this.map={};},getAllNodes:function(){return dojo.query("> .dojoDndItem",this.parent);},sync:function(){var map={};this.getAllNodes().forEach(function(node){if(node.id){var item=this.getItem(node.id);if(item){map[node.id]=item;return;}}else{node.id=dojo.dnd.getUniqueId();}var type=node.getAttribute("dndType"),data=node.getAttribute("dndData");map[node.id]={data:data||node.innerHTML,type:type?type.split(/\s*,\s*/):["text"]};},this);this.map=map;return this;},insertNodes:function(data,_2d9,_2da){if(!this.parent.firstChild){_2da=null;}else{if(_2d9){if(!_2da){_2da=this.parent.firstChild;}}else{if(_2da){_2da=_2da.nextSibling;}}}if(_2da){for(var i=0;i<data.length;++i){var t=this._normalizedCreator(data[i]);this.setItem(t.node.id,{data:t.data,type:t.type});this.parent.insertBefore(t.node,_2da);}}else{for(var i=0;i<data.length;++i){var t=this._normalizedCreator(data[i]);this.setItem(t.node.id,{data:t.data,type:t.type});this.parent.appendChild(t.node);}}return this;},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.clearItems();this.node=this.parent=this.current=null;},markupFactory:function(_2db,node){_2db._skipStartup=true;return new dojo.dnd.Container(node,_2db);},startup:function(){if(!this.parent){this.parent=this.node;if(this.parent.tagName.toLowerCase()=="table"){var c=this.parent.getElementsByTagName("tbody");if(c&&c.length){this.parent=c[0];}}}this.defaultCreator=dojo.dnd._defaultCreator(this.parent);this.sync();},onMouseOver:function(e){var n=e.relatedTarget;while(n){if(n==this.node){break;}try{n=n.parentNode;}catch(x){n=null;}}if(!n){this._changeState("Container","Over");this.onOverEvent();}n=this._getChildByEvent(e);if(this.current==n){return;}if(this.current){this._removeItemClass(this.current,"Over");}if(n){this._addItemClass(n,"Over");}this.current=n;},onMouseOut:function(e){for(var n=e.relatedTarget;n;){if(n==this.node){return;}try{n=n.parentNode;}catch(x){n=null;}}if(this.current){this._removeItemClass(this.current,"Over");this.current=null;}this._changeState("Container","");this.onOutEvent();},onSelectStart:function(e){if(!this.skipForm||!dojo.dnd.isFormElement(e)){dojo.stopEvent(e);}},onOverEvent:function(){},onOutEvent:function(){},_changeState:function(type,_2dc){var _2dd="dojoDnd"+type;var _2de=type.toLowerCase()+"State";dojo.removeClass(this.node,_2dd+this[_2de]);dojo.addClass(this.node,_2dd+_2dc);this[_2de]=_2dc;},_addItemClass:function(node,type){dojo.addClass(node,"dojoDndItem"+type);},_removeItemClass:function(node,type){dojo.removeClass(node,"dojoDndItem"+type);},_getChildByEvent:function(e){var node=e.target;if(node){for(var _2df=node.parentNode;_2df;node=_2df,_2df=node.parentNode){if(_2df==this.parent&&dojo.hasClass(node,"dojoDndItem")){return node;}}}return null;},_normalizedCreator:function(item,hint){var t=(this.creator||this.defaultCreator).call(this,item,hint);if(!dojo.isArray(t.type)){t.type=["text"];}if(!t.node.id){t.node.id=dojo.dnd.getUniqueId();}dojo.addClass(t.node,"dojoDndItem");return t;}});dojo.dnd._createNode=function(tag){if(!tag){return dojo.dnd._createSpan;}return function(text){return dojo.create(tag,{innerHTML:text});};};dojo.dnd._createTrTd=function(text){var tr=dojo.create("tr");dojo.create("td",{innerHTML:text},tr);return tr;};dojo.dnd._createSpan=function(text){return dojo.create("span",{innerHTML:text});};dojo.dnd._defaultCreatorNodes={ul:"li",ol:"li",div:"div",p:"div"};dojo.dnd._defaultCreator=function(node){var tag=node.tagName.toLowerCase();var c=tag=="tbody"||tag=="thead"?dojo.dnd._createTrTd:dojo.dnd._createNode(dojo.dnd._defaultCreatorNodes[tag]);return function(item,hint){var _2e0=item&&dojo.isObject(item),data,type,n;if(_2e0&&item.tagName&&item.nodeType&&item.getAttribute){data=item.getAttribute("dndData")||item.innerHTML;type=item.getAttribute("dndType");type=type?type.split(/\s*,\s*/):["text"];n=item;}else{data=(_2e0&&item.data)?item.data:item;type=(_2e0&&item.type)?item.type:["text"];n=(hint=="avatar"?dojo.dnd._createSpan:c)(String(data));}n.id=dojo.dnd.getUniqueId();return {node:n,data:data,type:type};};};}if(!dojo._hasResource["dojo.dnd.Selector"]){dojo._hasResource["dojo.dnd.Selector"]=true;dojo.provide("dojo.dnd.Selector");dojo.declare("dojo.dnd.Selector",dojo.dnd.Container,{constructor:function(node,_2e1){if(!_2e1){_2e1={};}this.singular=_2e1.singular;this.autoSync=_2e1.autoSync;this.selection={};this.anchor=null;this.simpleSelection=false;this.events.push(dojo.connect(this.node,"onmousedown",this,"onMouseDown"),dojo.connect(this.node,"onmouseup",this,"onMouseUp"));},singular:false,getSelectedNodes:function(){var t=new dojo.NodeList();var e=dojo.dnd._empty;for(var i in this.selection){if(i in e){continue;}t.push(dojo.byId(i));}return t;},selectNone:function(){return this._removeSelection()._removeAnchor();},selectAll:function(){this.forInItems(function(data,id){this._addItemClass(dojo.byId(id),"Selected");this.selection[id]=1;},this);return this._removeAnchor();},deleteSelectedNodes:function(){var e=dojo.dnd._empty;for(var i in this.selection){if(i in e){continue;}var n=dojo.byId(i);this.delItem(i);dojo.destroy(n);}this.anchor=null;this.selection={};return this;},forInSelectedItems:function(f,o){o=o||dojo.global;var s=this.selection,e=dojo.dnd._empty;for(var i in s){if(i in e){continue;}f.call(o,this.getItem(i),i,this);}},sync:function(){dojo.dnd.Selector.superclass.sync.call(this);if(this.anchor){if(!this.getItem(this.anchor.id)){this.anchor=null;}}var t=[],e=dojo.dnd._empty;for(var i in this.selection){if(i in e){continue;}if(!this.getItem(i)){t.push(i);}}dojo.forEach(t,function(i){delete this.selection[i];},this);return this;},insertNodes:function(_2e2,data,_2e3,_2e4){var _2e5=this._normalizedCreator;this._normalizedCreator=function(item,hint){var t=_2e5.call(this,item,hint);if(_2e2){if(!this.anchor){this.anchor=t.node;this._removeItemClass(t.node,"Selected");this._addItemClass(this.anchor,"Anchor");}else{if(this.anchor!=t.node){this._removeItemClass(t.node,"Anchor");this._addItemClass(t.node,"Selected");}}this.selection[t.node.id]=1;}else{this._removeItemClass(t.node,"Selected");this._removeItemClass(t.node,"Anchor");}return t;};dojo.dnd.Selector.superclass.insertNodes.call(this,data,_2e3,_2e4);this._normalizedCreator=_2e5;return this;},destroy:function(){dojo.dnd.Selector.superclass.destroy.call(this);this.selection=this.anchor=null;},markupFactory:function(_2e6,node){_2e6._skipStartup=true;return new dojo.dnd.Selector(node,_2e6);},onMouseDown:function(e){if(this.autoSync){this.sync();}if(!this.current){return;}if(!this.singular&&!dojo.isCopyKey(e)&&!e.shiftKey&&(this.current.id in this.selection)){this.simpleSelection=true;if(e.button===dojo.mouseButtons.LEFT){dojo.stopEvent(e);}return;}if(!this.singular&&e.shiftKey){if(!dojo.isCopyKey(e)){this._removeSelection();}var c=this.getAllNodes();if(c.length){if(!this.anchor){this.anchor=c[0];this._addItemClass(this.anchor,"Anchor");}this.selection[this.anchor.id]=1;if(this.anchor!=this.current){var i=0;for(;i<c.length;++i){var node=c[i];if(node==this.anchor||node==this.current){break;}}for(++i;i<c.length;++i){var node=c[i];if(node==this.anchor||node==this.current){break;}this._addItemClass(node,"Selected");this.selection[node.id]=1;}this._addItemClass(this.current,"Selected");this.selection[this.current.id]=1;}}}else{if(this.singular){if(this.anchor==this.current){if(dojo.isCopyKey(e)){this.selectNone();}}else{this.selectNone();this.anchor=this.current;this._addItemClass(this.anchor,"Anchor");this.selection[this.current.id]=1;}}else{if(dojo.isCopyKey(e)){if(this.anchor==this.current){delete this.selection[this.anchor.id];this._removeAnchor();}else{if(this.current.id in this.selection){this._removeItemClass(this.current,"Selected");delete this.selection[this.current.id];}else{if(this.anchor){this._removeItemClass(this.anchor,"Anchor");this._addItemClass(this.anchor,"Selected");}this.anchor=this.current;this._addItemClass(this.current,"Anchor");this.selection[this.current.id]=1;}}}else{if(!(this.current.id in this.selection)){this.selectNone();this.anchor=this.current;this._addItemClass(this.current,"Anchor");this.selection[this.current.id]=1;}}}}dojo.stopEvent(e);},onMouseUp:function(e){if(!this.simpleSelection){return;}this.simpleSelection=false;this.selectNone();if(this.current){this.anchor=this.current;this._addItemClass(this.anchor,"Anchor");this.selection[this.current.id]=1;}},onMouseMove:function(e){this.simpleSelection=false;},onOverEvent:function(){this.onmousemoveEvent=dojo.connect(this.node,"onmousemove",this,"onMouseMove");},onOutEvent:function(){dojo.disconnect(this.onmousemoveEvent);delete this.onmousemoveEvent;},_removeSelection:function(){var e=dojo.dnd._empty;for(var i in this.selection){if(i in e){continue;}var node=dojo.byId(i);if(node){this._removeItemClass(node,"Selected");}}this.selection={};return this;},_removeAnchor:function(){if(this.anchor){this._removeItemClass(this.anchor,"Anchor");this.anchor=null;}return this;}});}if(!dojo._hasResource["dojo.dnd.Avatar"]){dojo._hasResource["dojo.dnd.Avatar"]=true;dojo.provide("dojo.dnd.Avatar");dojo.declare("dojo.dnd.Avatar",null,{constructor:function(_2e7){this.manager=_2e7;this.construct();},construct:function(){this.isA11y=dojo.hasClass(dojo.body(),"dijit_a11y");var a=dojo.create("table",{"class":"dojoDndAvatar",style:{position:"absolute",zIndex:"1999",margin:"0px"}}),_2e8=this.manager.source,node,b=dojo.create("tbody",null,a),tr=dojo.create("tr",null,b),td=dojo.create("td",null,tr),icon=this.isA11y?dojo.create("span",{id:"a11yIcon",innerHTML:this.manager.copy?"+":"<"},td):null,span=dojo.create("span",{innerHTML:_2e8.generateText?this._generateText():""},td),k=Math.min(5,this.manager.nodes.length),i=0;dojo.attr(tr,{"class":"dojoDndAvatarHeader",style:{opacity:0.9}});for(;i<k;++i){if(_2e8.creator){node=_2e8._normalizedCreator(_2e8.getItem(this.manager.nodes[i].id).data,"avatar").node;}else{node=this.manager.nodes[i].cloneNode(true);if(node.tagName.toLowerCase()=="tr"){var _2e9=dojo.create("table"),_2ea=dojo.create("tbody",null,_2e9);_2ea.appendChild(node);node=_2e9;}}node.id="";tr=dojo.create("tr",null,b);td=dojo.create("td",null,tr);td.appendChild(node);dojo.attr(tr,{"class":"dojoDndAvatarItem",style:{opacity:(9-i)/10}});}this.node=a;},destroy:function(){dojo.destroy(this.node);this.node=false;},update:function(){dojo[(this.manager.canDropFlag?"add":"remove")+"Class"](this.node,"dojoDndAvatarCanDrop");if(this.isA11y){var icon=dojo.byId("a11yIcon");var text="+";if(this.manager.canDropFlag&&!this.manager.copy){text="< ";}else{if(!this.manager.canDropFlag&&!this.manager.copy){text="o";}else{if(!this.manager.canDropFlag){text="x";}}}icon.innerHTML=text;}dojo.query(("tr.dojoDndAvatarHeader td span"+(this.isA11y?" span":"")),this.node).forEach(function(node){node.innerHTML=this._generateText();},this);},_generateText:function(){return this.manager.nodes.length.toString();}});}if(!dojo._hasResource["dojo.dnd.Manager"]){dojo._hasResource["dojo.dnd.Manager"]=true;dojo.provide("dojo.dnd.Manager");dojo.declare("dojo.dnd.Manager",null,{constructor:function(){this.avatar=null;this.source=null;this.nodes=[];this.copy=true;this.target=null;this.canDropFlag=false;this.events=[];},OFFSET_X:16,OFFSET_Y:16,overSource:function(_2eb){if(this.avatar){this.target=(_2eb&&_2eb.targetState!="Disabled")?_2eb:null;this.canDropFlag=Boolean(this.target);this.avatar.update();}dojo.publish("/dnd/source/over",[_2eb]);},outSource:function(_2ec){if(this.avatar){if(this.target==_2ec){this.target=null;this.canDropFlag=false;this.avatar.update();dojo.publish("/dnd/source/over",[null]);}}else{dojo.publish("/dnd/source/over",[null]);}},startDrag:function(_2ed,_2ee,copy){this.source=_2ed;this.nodes=_2ee;this.copy=Boolean(copy);this.avatar=this.makeAvatar();dojo.body().appendChild(this.avatar.node);dojo.publish("/dnd/start",[_2ed,_2ee,this.copy]);this.events=[dojo.connect(dojo.doc,"onmousemove",this,"onMouseMove"),dojo.connect(dojo.doc,"onmouseup",this,"onMouseUp"),dojo.connect(dojo.doc,"onkeydown",this,"onKeyDown"),dojo.connect(dojo.doc,"onkeyup",this,"onKeyUp"),dojo.connect(dojo.doc,"ondragstart",dojo.stopEvent),dojo.connect(dojo.body(),"onselectstart",dojo.stopEvent)];var c="dojoDnd"+(copy?"Copy":"Move");dojo.addClass(dojo.body(),c);},canDrop:function(flag){var _2ef=Boolean(this.target&&flag);if(this.canDropFlag!=_2ef){this.canDropFlag=_2ef;this.avatar.update();}},stopDrag:function(){dojo.removeClass(dojo.body(),"dojoDndCopy");dojo.removeClass(dojo.body(),"dojoDndMove");dojo.forEach(this.events,dojo.disconnect);this.events=[];this.avatar.destroy();this.avatar=null;this.source=this.target=null;this.nodes=[];},makeAvatar:function(){return new dojo.dnd.Avatar(this);},updateAvatar:function(){this.avatar.update();},onMouseMove:function(e){var a=this.avatar;if(a){dojo.dnd.autoScrollNodes(e);var s=a.node.style;s.left=(e.pageX+this.OFFSET_X)+"px";s.top=(e.pageY+this.OFFSET_Y)+"px";var copy=Boolean(this.source.copyState(dojo.isCopyKey(e)));if(this.copy!=copy){this._setCopyStatus(copy);}}},onMouseUp:function(e){if(this.avatar){if(this.target&&this.canDropFlag){var copy=Boolean(this.source.copyState(dojo.isCopyKey(e))),_2f0=[this.source,this.nodes,copy,this.target];dojo.publish("/dnd/drop/before",_2f0);dojo.publish("/dnd/drop",_2f0);}else{dojo.publish("/dnd/cancel");}this.stopDrag();}},onKeyDown:function(e){if(this.avatar){switch(e.keyCode){case dojo.keys.CTRL:var copy=Boolean(this.source.copyState(true));if(this.copy!=copy){this._setCopyStatus(copy);}break;case dojo.keys.ESCAPE:dojo.publish("/dnd/cancel");this.stopDrag();break;}}},onKeyUp:function(e){if(this.avatar&&e.keyCode==dojo.keys.CTRL){var copy=Boolean(this.source.copyState(false));if(this.copy!=copy){this._setCopyStatus(copy);}}},_setCopyStatus:function(copy){this.copy=copy;this.source._markDndStatus(this.copy);this.updateAvatar();dojo.removeClass(dojo.body(),"dojoDnd"+(this.copy?"Move":"Copy"));dojo.addClass(dojo.body(),"dojoDnd"+(this.copy?"Copy":"Move"));}});dojo.dnd._manager=null;dojo.dnd.manager=function(){if(!dojo.dnd._manager){dojo.dnd._manager=new dojo.dnd.Manager();}return dojo.dnd._manager;};}if(!dojo._hasResource["dojo.dnd.Source"]){dojo._hasResource["dojo.dnd.Source"]=true;dojo.provide("dojo.dnd.Source");dojo.declare("dojo.dnd.Source",dojo.dnd.Selector,{isSource:true,horizontal:false,copyOnly:false,selfCopy:false,selfAccept:true,skipForm:false,withHandles:false,autoSync:false,delay:0,accept:["text"],generateText:true,constructor:function(node,_2f1){dojo.mixin(this,dojo.mixin({},_2f1));var type=this.accept;if(type.length){this.accept={};for(var i=0;i<type.length;++i){this.accept[type[i]]=1;}}this.isDragging=false;this.mouseDown=false;this.targetAnchor=null;this.targetBox=null;this.before=true;this._lastX=0;this._lastY=0;this.sourceState="";if(this.isSource){dojo.addClass(this.node,"dojoDndSource");}this.targetState="";if(this.accept){dojo.addClass(this.node,"dojoDndTarget");}if(this.horizontal){dojo.addClass(this.node,"dojoDndHorizontal");}this.topics=[dojo.subscribe("/dnd/source/over",this,"onDndSourceOver"),dojo.subscribe("/dnd/start",this,"onDndStart"),dojo.subscribe("/dnd/drop",this,"onDndDrop"),dojo.subscribe("/dnd/cancel",this,"onDndCancel")];},checkAcceptance:function(_2f2,_2f3){if(this==_2f2){return !this.copyOnly||this.selfAccept;}for(var i=0;i<_2f3.length;++i){var type=_2f2.getItem(_2f3[i].id).type;var flag=false;for(var j=0;j<type.length;++j){if(type[j] in this.accept){flag=true;break;}}if(!flag){return false;}}return true;},copyState:function(_2f4,self){if(_2f4){return true;}if(arguments.length<2){self=this==dojo.dnd.manager().target;}if(self){if(this.copyOnly){return this.selfCopy;}}else{return this.copyOnly;}return false;},destroy:function(){dojo.dnd.Source.superclass.destroy.call(this);dojo.forEach(this.topics,dojo.unsubscribe);this.targetAnchor=null;},markupFactory:function(_2f5,node){_2f5._skipStartup=true;return new dojo.dnd.Source(node,_2f5);},onMouseMove:function(e){if(this.isDragging&&this.targetState=="Disabled"){return;}dojo.dnd.Source.superclass.onMouseMove.call(this,e);var m=dojo.dnd.manager();if(this.isDragging){var _2f6=false;if(this.current){if(!this.targetBox||this.targetAnchor!=this.current){this.targetBox=dojo.position(this.current,true);}if(this.horizontal){_2f6=(e.pageX-this.targetBox.x)<(this.targetBox.w/2);}else{_2f6=(e.pageY-this.targetBox.y)<(this.targetBox.h/2);}}if(this.current!=this.targetAnchor||_2f6!=this.before){this._markTargetAnchor(_2f6);m.canDrop(!this.current||m.source!=this||!(this.current.id in this.selection));}}else{if(this.mouseDown&&this.isSource&&(Math.abs(e.pageX-this._lastX)>this.delay||Math.abs(e.pageY-this._lastY)>this.delay)){var _2f7=this.getSelectedNodes();if(_2f7.length){m.startDrag(this,_2f7,this.copyState(dojo.isCopyKey(e),true));}}}},onMouseDown:function(e){if(!this.mouseDown&&this._legalMouseDown(e)&&(!this.skipForm||!dojo.dnd.isFormElement(e))){this.mouseDown=true;this._lastX=e.pageX;this._lastY=e.pageY;dojo.dnd.Source.superclass.onMouseDown.call(this,e);}},onMouseUp:function(e){if(this.mouseDown){this.mouseDown=false;dojo.dnd.Source.superclass.onMouseUp.call(this,e);}},onDndSourceOver:function(_2f8){if(this!=_2f8){this.mouseDown=false;if(this.targetAnchor){this._unmarkTargetAnchor();}}else{if(this.isDragging){var m=dojo.dnd.manager();m.canDrop(this.targetState!="Disabled"&&(!this.current||m.source!=this||!(this.current.id in this.selection)));}}},onDndStart:function(_2f9,_2fa,copy){if(this.autoSync){this.sync();}if(this.isSource){this._changeState("Source",this==_2f9?(copy?"Copied":"Moved"):"");}var _2fb=this.accept&&this.checkAcceptance(_2f9,_2fa);this._changeState("Target",_2fb?"":"Disabled");if(this==_2f9){dojo.dnd.manager().overSource(this);}this.isDragging=true;},onDndDrop:function(_2fc,_2fd,copy,_2fe){if(this==_2fe){this.onDrop(_2fc,_2fd,copy);}this.onDndCancel();},onDndCancel:function(){if(this.targetAnchor){this._unmarkTargetAnchor();this.targetAnchor=null;}this.before=true;this.isDragging=false;this.mouseDown=false;this._changeState("Source","");this._changeState("Target","");},onDrop:function(_2ff,_300,copy){if(this!=_2ff){this.onDropExternal(_2ff,_300,copy);}else{this.onDropInternal(_300,copy);}},onDropExternal:function(_301,_302,copy){var _303=this._normalizedCreator;if(this.creator){this._normalizedCreator=function(node,hint){return _303.call(this,_301.getItem(node.id).data,hint);};}else{if(copy){this._normalizedCreator=function(node,hint){var t=_301.getItem(node.id);var n=node.cloneNode(true);n.id=dojo.dnd.getUniqueId();return {node:n,data:t.data,type:t.type};};}else{this._normalizedCreator=function(node,hint){var t=_301.getItem(node.id);_301.delItem(node.id);return {node:node,data:t.data,type:t.type};};}}this.selectNone();if(!copy&&!this.creator){_301.selectNone();}this.insertNodes(true,_302,this.before,this.current);if(!copy&&this.creator){_301.deleteSelectedNodes();}this._normalizedCreator=_303;},onDropInternal:function(_304,copy){var _305=this._normalizedCreator;if(this.current&&this.current.id in this.selection){return;}if(copy){if(this.creator){this._normalizedCreator=function(node,hint){return _305.call(this,this.getItem(node.id).data,hint);};}else{this._normalizedCreator=function(node,hint){var t=this.getItem(node.id);var n=node.cloneNode(true);n.id=dojo.dnd.getUniqueId();return {node:n,data:t.data,type:t.type};};}}else{if(!this.current){return;}this._normalizedCreator=function(node,hint){var t=this.getItem(node.id);return {node:node,data:t.data,type:t.type};};}this._removeSelection();this.insertNodes(true,_304,this.before,this.current);this._normalizedCreator=_305;},onDraggingOver:function(){},onDraggingOut:function(){},onOverEvent:function(){dojo.dnd.Source.superclass.onOverEvent.call(this);dojo.dnd.manager().overSource(this);if(this.isDragging&&this.targetState!="Disabled"){this.onDraggingOver();}},onOutEvent:function(){dojo.dnd.Source.superclass.onOutEvent.call(this);dojo.dnd.manager().outSource(this);if(this.isDragging&&this.targetState!="Disabled"){this.onDraggingOut();}},_markTargetAnchor:function(_306){if(this.current==this.targetAnchor&&this.before==_306){return;}if(this.targetAnchor){this._removeItemClass(this.targetAnchor,this.before?"Before":"After");}this.targetAnchor=this.current;this.targetBox=null;this.before=_306;if(this.targetAnchor){this._addItemClass(this.targetAnchor,this.before?"Before":"After");}},_unmarkTargetAnchor:function(){if(!this.targetAnchor){return;}this._removeItemClass(this.targetAnchor,this.before?"Before":"After");this.targetAnchor=null;this.targetBox=null;this.before=true;},_markDndStatus:function(copy){this._changeState("Source",copy?"Copied":"Moved");},_legalMouseDown:function(e){if(!dojo.mouseButtons.isLeft(e)){return false;}if(!this.withHandles){return true;}for(var node=e.target;node&&node!==this.node;node=node.parentNode){if(dojo.hasClass(node,"dojoDndHandle")){return true;}if(dojo.hasClass(node,"dojoDndItem")||dojo.hasClass(node,"dojoDndIgnore")){break;}}return false;}});dojo.declare("dojo.dnd.Target",dojo.dnd.Source,{constructor:function(node,_307){this.isSource=false;dojo.removeClass(this.node,"dojoDndSource");},markupFactory:function(_308,node){_308._skipStartup=true;return new dojo.dnd.Target(node,_308);}});dojo.declare("dojo.dnd.AutoSource",dojo.dnd.Source,{constructor:function(node,_309){this.autoSync=true;},markupFactory:function(_30a,node){_30a._skipStartup=true;return new dojo.dnd.AutoSource(node,_30a);}});}if(!dojo._hasResource["dojox.grid._View"]){dojo._hasResource["dojox.grid._View"]=true;dojo.provide("dojox.grid._View");(function(){var _30b=function(_30c,_30d){return _30c.style.cssText==undefined?_30c.getAttribute("style"):_30c.style.cssText;};dojo.declare("dojox.grid._View",[dijit._Widget,dijit._Templated],{defaultWidth:"18em",viewWidth:"",templateString:"<div class=\"dojoxGridView\" wairole=\"presentation\">\n\t<div class=\"dojoxGridHeader\" dojoAttachPoint=\"headerNode\" wairole=\"presentation\">\n\t\t<div dojoAttachPoint=\"headerNodeContainer\" style=\"width:9000em\" wairole=\"presentation\">\n\t\t\t<div dojoAttachPoint=\"headerContentNode\" wairole=\"row\"></div>\n\t\t</div>\n\t</div>\n\t<input type=\"checkbox\" class=\"dojoxGridHiddenFocus\" dojoAttachPoint=\"hiddenFocusNode\" wairole=\"presentation\" />\n\t<input type=\"checkbox\" class=\"dojoxGridHiddenFocus\" wairole=\"presentation\" />\n\t<div class=\"dojoxGridScrollbox\" dojoAttachPoint=\"scrollboxNode\" wairole=\"presentation\">\n\t\t<div class=\"dojoxGridContent\" dojoAttachPoint=\"contentNode\" hidefocus=\"hidefocus\" wairole=\"presentation\"></div>\n\t</div>\n</div>\n",themeable:false,classTag:"dojoxGrid",marginBottom:0,rowPad:2,_togglingColumn:-1,_headerBuilderClass:dojox.grid._HeaderBuilder,_contentBuilderClass:dojox.grid._ContentBuilder,postMixInProperties:function(){this.rowNodes={};},postCreate:function(){this.connect(this.scrollboxNode,"onscroll","doscroll");dojox.grid.util.funnelEvents(this.contentNode,this,"doContentEvent",["mouseover","mouseout","click","dblclick","contextmenu","mousedown"]);dojox.grid.util.funnelEvents(this.headerNode,this,"doHeaderEvent",["dblclick","mouseover","mouseout","mousemove","mousedown","click","contextmenu"]);this.content=new this._contentBuilderClass(this);this.header=new this._headerBuilderClass(this);if(!dojo._isBodyLtr()){this.headerNodeContainer.style.width="";}},destroy:function(){dojo.destroy(this.headerNode);delete this.headerNode;for(var i in this.rowNodes){dojo.destroy(this.rowNodes[i]);}this.rowNodes={};if(this.source){this.source.destroy();}this.inherited(arguments);},focus:function(){if(dojo.isIE||dojo.isWebKit||dojo.isOpera){this.hiddenFocusNode.focus();}else{this.scrollboxNode.focus();}},setStructure:function(_30e){var vs=(this.structure=_30e);if(vs.width&&!isNaN(vs.width)){this.viewWidth=vs.width+"em";}else{this.viewWidth=vs.width||(vs.noscroll?"auto":this.viewWidth);}this._onBeforeRow=vs.onBeforeRow||function(){};this._onAfterRow=vs.onAfterRow||function(){};this.noscroll=vs.noscroll;if(this.noscroll){this.scrollboxNode.style.overflow="hidden";}this.simpleStructure=Boolean(vs.cells.length==1);this.testFlexCells();this.updateStructure();},_cleanupRowWidgets:function(_30f){if(_30f){dojo.forEach(dojo.query("[widgetId]",_30f).map(dijit.byNode),function(w){if(w._destroyOnRemove){w.destroy();delete w;}else{if(w.domNode&&w.domNode.parentNode){w.domNode.parentNode.removeChild(w.domNode);}}});}},onBeforeRow:function(_310,_311){this._onBeforeRow(_310,_311);if(_310>=0){this._cleanupRowWidgets(this.getRowNode(_310));}},onAfterRow:function(_312,_313,_314){this._onAfterRow(_312,_313,_314);var g=this.grid;dojo.forEach(dojo.query(".dojoxGridStubNode",_314),function(n){if(n&&n.parentNode){var lw=n.getAttribute("linkWidget");var _315=window.parseInt(dojo.attr(n,"cellIdx"),10);var _316=g.getCell(_315);var w=dijit.byId(lw);if(w){n.parentNode.replaceChild(w.domNode,n);if(!w._started){w.startup();}}else{n.innerHTML="";}}},this);},testFlexCells:function(){this.flexCells=false;for(var j=0,row;(row=this.structure.cells[j]);j++){for(var i=0,cell;(cell=row[i]);i++){cell.view=this;this.flexCells=this.flexCells||cell.isFlex();}}return this.flexCells;},updateStructure:function(){this.header.update();this.content.update();},getScrollbarWidth:function(){var _317=this.hasVScrollbar();var _318=dojo.style(this.scrollboxNode,"overflow");if(this.noscroll||!_318||_318=="hidden"){_317=false;}else{if(_318=="scroll"){_317=true;}}return (_317?dojox.html.metrics.getScrollbar().w:0);},getColumnsWidth:function(){var h=this.headerContentNode;return h&&h.firstChild?h.firstChild.offsetWidth:0;},setColumnsWidth:function(_319){this.headerContentNode.firstChild.style.width=_319+"px";if(this.viewWidth){this.viewWidth=_319+"px";}},getWidth:function(){return this.viewWidth||(this.getColumnsWidth()+this.getScrollbarWidth())+"px";},getContentWidth:function(){return Math.max(0,dojo._getContentBox(this.domNode).w-this.getScrollbarWidth())+"px";},render:function(){this.scrollboxNode.style.height="";this.renderHeader();if(this._togglingColumn>=0){this.setColumnsWidth(this.getColumnsWidth()-this._togglingColumn);this._togglingColumn=-1;}var _31a=this.grid.layout.cells;var _31b=dojo.hitch(this,function(node,_31c){var inc=_31c?-1:1;var idx=this.header.getCellNodeIndex(node)+inc;var cell=_31a[idx];while(cell&&cell.getHeaderNode()&&cell.getHeaderNode().style.display=="none"){idx+=inc;cell=_31a[idx];}if(cell){return cell.getHeaderNode();}return null;});if(this.grid.columnReordering&&this.simpleStructure){if(this.source){this.source.destroy();}var _31d="dojoxGrid_bottomMarker";var _31e="dojoxGrid_topMarker";if(this.bottomMarker){dojo.destroy(this.bottomMarker);}this.bottomMarker=dojo.byId(_31d);if(this.topMarker){dojo.destroy(this.topMarker);}this.topMarker=dojo.byId(_31e);if(!this.bottomMarker){this.bottomMarker=dojo.create("div",{"id":_31d,"class":"dojoxGridColPlaceBottom"},dojo.body());this._hide(this.bottomMarker);this.topMarker=dojo.create("div",{"id":_31e,"class":"dojoxGridColPlaceTop"},dojo.body());this._hide(this.topMarker);}this.arrowDim=dojo.contentBox(this.bottomMarker);var _31f=dojo.contentBox(this.headerContentNode.firstChild.rows[0]).h;this.source=new dojo.dnd.Source(this.headerContentNode.firstChild.rows[0],{horizontal:true,accept:["gridColumn_"+this.grid.id],viewIndex:this.index,generateText:false,onMouseDown:dojo.hitch(this,function(e){this.header.decorateEvent(e);if((this.header.overRightResizeArea(e)||this.header.overLeftResizeArea(e))&&this.header.canResize(e)&&!this.header.moveable){this.header.beginColumnResize(e);}else{if(this.grid.headerMenu){this.grid.headerMenu.onCancel(true);}if(e.button===(dojo.isIE?1:0)){dojo.dnd.Source.prototype.onMouseDown.call(this.source,e);}}}),onMouseOver:dojo.hitch(this,function(e){var src=this.source;if(src._getChildByEvent(e)){dojo.dnd.Source.prototype.onMouseOver.apply(src,arguments);}}),_markTargetAnchor:dojo.hitch(this,function(_320){var src=this.source;if(src.current==src.targetAnchor&&src.before==_320){return;}if(src.targetAnchor&&_31b(src.targetAnchor,src.before)){src._removeItemClass(_31b(src.targetAnchor,src.before),src.before?"After":"Before");}dojo.dnd.Source.prototype._markTargetAnchor.call(src,_320);var _321=_320?src.targetAnchor:_31b(src.targetAnchor,src.before);var _322=0;if(!_321){_321=src.targetAnchor;_322=dojo.contentBox(_321).w+this.arrowDim.w/2+2;}var pos=(dojo.position||dojo._abs)(_321,true);var left=Math.floor(pos.x-this.arrowDim.w/2+_322);dojo.style(this.bottomMarker,"visibility","visible");dojo.style(this.topMarker,"visibility","visible");dojo.style(this.bottomMarker,{"left":left+"px","top":(_31f+pos.y)+"px"});dojo.style(this.topMarker,{"left":left+"px","top":(pos.y-this.arrowDim.h)+"px"});if(src.targetAnchor&&_31b(src.targetAnchor,src.before)){src._addItemClass(_31b(src.targetAnchor,src.before),src.before?"After":"Before");}}),_unmarkTargetAnchor:dojo.hitch(this,function(){var src=this.source;if(!src.targetAnchor){return;}if(src.targetAnchor&&_31b(src.targetAnchor,src.before)){src._removeItemClass(_31b(src.targetAnchor,src.before),src.before?"After":"Before");}this._hide(this.bottomMarker);this._hide(this.topMarker);dojo.dnd.Source.prototype._unmarkTargetAnchor.call(src);}),destroy:dojo.hitch(this,function(){dojo.disconnect(this._source_conn);dojo.unsubscribe(this._source_sub);dojo.dnd.Source.prototype.destroy.call(this.source);if(this.bottomMarker){dojo.destroy(this.bottomMarker);delete this.bottomMarker;}if(this.topMarker){dojo.destroy(this.topMarker);delete this.topMarker;}}),onDndCancel:dojo.hitch(this,function(){dojo.dnd.Source.prototype.onDndCancel.call(this.source);this._hide(this.bottomMarker);this._hide(this.topMarker);})});this._source_conn=dojo.connect(this.source,"onDndDrop",this,"_onDndDrop");this._source_sub=dojo.subscribe("/dnd/drop/before",this,"_onDndDropBefore");this.source.startup();}},_hide:function(node){dojo.style(node,{left:"-10000px",top:"-10000px","visibility":"hidden"});},_onDndDropBefore:function(_323,_324,copy){if(dojo.dnd.manager().target!==this.source){return;}this.source._targetNode=this.source.targetAnchor;this.source._beforeTarget=this.source.before;var _325=this.grid.views.views;var _326=_325[_323.viewIndex];var _327=_325[this.index];if(_327!=_326){_326.convertColPctToFixed();_327.convertColPctToFixed();}},_onDndDrop:function(_328,_329,copy){if(dojo.dnd.manager().target!==this.source){if(dojo.dnd.manager().source===this.source){this._removingColumn=true;}return;}this._hide(this.bottomMarker);this._hide(this.topMarker);var _32a=function(n){return n?dojo.attr(n,"idx"):null;};var w=dojo.marginBox(_329[0]).w;if(_328.viewIndex!==this.index){var _32b=this.grid.views.views;var _32c=_32b[_328.viewIndex];var _32d=_32b[this.index];if(_32c.viewWidth&&_32c.viewWidth!="auto"){_32c.setColumnsWidth(_32c.getColumnsWidth()-w);}if(_32d.viewWidth&&_32d.viewWidth!="auto"){_32d.setColumnsWidth(_32d.getColumnsWidth());}}var stn=this.source._targetNode;var stb=this.source._beforeTarget;var _32e=this.grid.layout;var idx=this.index;delete this.source._targetNode;delete this.source._beforeTarget;_32e.moveColumn(_328.viewIndex,idx,_32a(_329[0]),_32a(stn),stb);},renderHeader:function(){this.headerContentNode.innerHTML=this.header.generateHtml(this._getHeaderContent);if(this.flexCells){this.contentWidth=this.getContentWidth();this.headerContentNode.firstChild.style.width=this.contentWidth;}dojox.grid.util.fire(this,"onAfterRow",[-1,this.structure.cells,this.headerContentNode]);},_getHeaderContent:function(_32f){var n=_32f.name||_32f.grid.getCellName(_32f);var ret=["<div class=\"dojoxGridSortNode"];if(_32f.index!=_32f.grid.getSortIndex()){ret.push("\">");}else{ret=ret.concat([" ",_32f.grid.sortInfo>0?"dojoxGridSortUp":"dojoxGridSortDown","\"><div class=\"dojoxGridArrowButtonChar\">",_32f.grid.sortInfo>0?"&#9650;":"&#9660;","</div><div class=\"dojoxGridArrowButtonNode\" role=\"presentation\"></div>"]);}ret=ret.concat([n,"</div>"]);return ret.join("");},resize:function(){this.adaptHeight();this.adaptWidth();},hasHScrollbar:function(_330){var _331=this._hasHScroll||false;if(this._hasHScroll==undefined||_330){if(this.noscroll){this._hasHScroll=false;}else{var _332=dojo.style(this.scrollboxNode,"overflow");if(_332=="hidden"){this._hasHScroll=false;}else{if(_332=="scroll"){this._hasHScroll=true;}else{this._hasHScroll=(this.scrollboxNode.offsetWidth-this.getScrollbarWidth()<this.contentNode.offsetWidth);}}}}if(_331!==this._hasHScroll){this.grid.update();}return this._hasHScroll;},hasVScrollbar:function(_333){var _334=this._hasVScroll||false;if(this._hasVScroll==undefined||_333){if(this.noscroll){this._hasVScroll=false;}else{var _335=dojo.style(this.scrollboxNode,"overflow");if(_335=="hidden"){this._hasVScroll=false;}else{if(_335=="scroll"){this._hasVScroll=true;}else{this._hasVScroll=(this.scrollboxNode.scrollHeight>this.scrollboxNode.clientHeight);}}}}if(_334!==this._hasVScroll){this.grid.update();}return this._hasVScroll;},convertColPctToFixed:function(){var _336=false;this.grid.initialWidth="";var _337=dojo.query("th",this.headerContentNode);var _338=dojo.map(_337,function(c,vIdx){var w=c.style.width;dojo.attr(c,"vIdx",vIdx);if(w&&w.slice(-1)=="%"){_336=true;}else{if(w&&w.slice(-2)=="px"){return window.parseInt(w,10);}}return dojo.contentBox(c).w;});if(_336){dojo.forEach(this.grid.layout.cells,function(cell,idx){if(cell.view==this){var _339=cell.view.getHeaderCellNode(cell.index);if(_339&&dojo.hasAttr(_339,"vIdx")){var vIdx=window.parseInt(dojo.attr(_339,"vIdx"));this.setColWidth(idx,_338[vIdx]);dojo.removeAttr(_339,"vIdx");}}},this);return true;}return false;},adaptHeight:function(_33a){if(!this.grid._autoHeight){var h=(this.domNode.style.height&&parseInt(this.domNode.style.height.replace(/px/,""),10))||this.domNode.clientHeight;var self=this;var _33b=function(){var v;for(var i in self.grid.views.views){v=self.grid.views.views[i];if(v!==self&&v.hasHScrollbar()){return true;}}return false;};if(_33a||(this.noscroll&&_33b())){h-=dojox.html.metrics.getScrollbar().h;}dojox.grid.util.setStyleHeightPx(this.scrollboxNode,h);}this.hasVScrollbar(true);},adaptWidth:function(){if(this.flexCells){this.contentWidth=this.getContentWidth();this.headerContentNode.firstChild.style.width=this.contentWidth;}var w=this.scrollboxNode.offsetWidth-this.getScrollbarWidth();if(!this._removingColumn){w=Math.max(w,this.getColumnsWidth())+"px";}else{w=Math.min(w,this.getColumnsWidth())+"px";this._removingColumn=false;}var cn=this.contentNode;cn.style.width=w;this.hasHScrollbar(true);},setSize:function(w,h){var ds=this.domNode.style;var hs=this.headerNode.style;if(w){ds.width=w;hs.width=w;}ds.height=(h>=0?h+"px":"");},renderRow:function(_33c){var _33d=this.createRowNode(_33c);this.buildRow(_33c,_33d);this.grid.edit.restore(this,_33c);return _33d;},createRowNode:function(_33e){var node=document.createElement("div");node.className=this.classTag+"Row";if(this instanceof dojox.grid._RowSelector){dojo.attr(node,"role","presentation");}else{dojo.attr(node,"role","row");if(this.grid.selectionMode!="none"){dojo.attr(node,"aria-selected","false");}}node[dojox.grid.util.gridViewTag]=this.id;node[dojox.grid.util.rowIndexTag]=_33e;this.rowNodes[_33e]=node;return node;},buildRow:function(_33f,_340){this.buildRowContent(_33f,_340);this.styleRow(_33f,_340);},buildRowContent:function(_341,_342){_342.innerHTML=this.content.generateHtml(_341,_341);if(this.flexCells&&this.contentWidth){_342.firstChild.style.width=this.contentWidth;}dojox.grid.util.fire(this,"onAfterRow",[_341,this.structure.cells,_342]);},rowRemoved:function(_343){if(_343>=0){this._cleanupRowWidgets(this.getRowNode(_343));}this.grid.edit.save(this,_343);delete this.rowNodes[_343];},getRowNode:function(_344){return this.rowNodes[_344];},getCellNode:function(_345,_346){var row=this.getRowNode(_345);if(row){return this.content.getCellNode(row,_346);}},getHeaderCellNode:function(_347){if(this.headerContentNode){return this.header.getCellNode(this.headerContentNode,_347);}},styleRow:function(_348,_349){_349._style=_30b(_349);this.styleRowNode(_348,_349);},styleRowNode:function(_34a,_34b){if(_34b){this.doStyleRowNode(_34a,_34b);}},doStyleRowNode:function(_34c,_34d){this.grid.styleRowNode(_34c,_34d);},updateRow:function(_34e){var _34f=this.getRowNode(_34e);if(_34f){_34f.style.height="";this.buildRow(_34e,_34f);}return _34f;},updateRowStyles:function(_350){this.styleRowNode(_350,this.getRowNode(_350));},lastTop:0,firstScroll:0,doscroll:function(_351){var _352=dojo._isBodyLtr();if(this.firstScroll<2){if((!_352&&this.firstScroll==1)||(_352&&this.firstScroll===0)){var s=dojo.marginBox(this.headerNodeContainer);if(dojo.isIE){this.headerNodeContainer.style.width=s.w+this.getScrollbarWidth()+"px";}else{if(dojo.isMoz){this.headerNodeContainer.style.width=s.w-this.getScrollbarWidth()+"px";this.scrollboxNode.scrollLeft=_352?this.scrollboxNode.clientWidth-this.scrollboxNode.scrollWidth:this.scrollboxNode.scrollWidth-this.scrollboxNode.clientWidth;}}}this.firstScroll++;}this.headerNode.scrollLeft=this.scrollboxNode.scrollLeft;var top=this.scrollboxNode.scrollTop;if(top!==this.lastTop){this.grid.scrollTo(top);}},setScrollTop:function(_353){this.lastTop=_353;this.scrollboxNode.scrollTop=_353;return this.scrollboxNode.scrollTop;},doContentEvent:function(e){if(this.content.decorateEvent(e)){this.grid.onContentEvent(e);}},doHeaderEvent:function(e){if(this.header.decorateEvent(e)){this.grid.onHeaderEvent(e);}},dispatchContentEvent:function(e){return this.content.dispatchEvent(e);},dispatchHeaderEvent:function(e){return this.header.dispatchEvent(e);},setColWidth:function(_354,_355){this.grid.setCellWidth(_354,_355+"px");},update:function(){if(!this.domNode){return;}this.content.update();this.grid.update();var left=this.scrollboxNode.scrollLeft;this.scrollboxNode.scrollLeft=left;this.headerNode.scrollLeft=left;}});dojo.declare("dojox.grid._GridAvatar",dojo.dnd.Avatar,{construct:function(){var dd=dojo.doc;var a=dd.createElement("table");a.cellPadding=a.cellSpacing="0";a.className="dojoxGridDndAvatar";a.style.position="absolute";a.style.zIndex=1999;a.style.margin="0px";var b=dd.createElement("tbody");var tr=dd.createElement("tr");var td=dd.createElement("td");var img=dd.createElement("td");tr.className="dojoxGridDndAvatarItem";img.className="dojoxGridDndAvatarItemImage";img.style.width="16px";var _356=this.manager.source,node;if(_356.creator){node=_356._normalizedCreator(_356.getItem(this.manager.nodes[0].id).data,"avatar").node;}else{node=this.manager.nodes[0].cloneNode(true);var _357,_358;if(node.tagName.toLowerCase()=="tr"){_357=dd.createElement("table");_358=dd.createElement("tbody");_358.appendChild(node);_357.appendChild(_358);node=_357;}else{if(node.tagName.toLowerCase()=="th"){_357=dd.createElement("table");_358=dd.createElement("tbody");var r=dd.createElement("tr");_357.cellPadding=_357.cellSpacing="0";r.appendChild(node);_358.appendChild(r);_357.appendChild(_358);node=_357;}}}node.id="";td.appendChild(node);tr.appendChild(img);tr.appendChild(td);dojo.style(tr,"opacity",0.9);b.appendChild(tr);a.appendChild(b);this.node=a;var m=dojo.dnd.manager();this.oldOffsetY=m.OFFSET_Y;m.OFFSET_Y=1;},destroy:function(){dojo.dnd.manager().OFFSET_Y=this.oldOffsetY;this.inherited(arguments);}});var _359=dojo.dnd.manager().makeAvatar;dojo.dnd.manager().makeAvatar=function(){var src=this.source;if(src.viewIndex!==undefined&&!dojo.hasClass(dojo.body(),"dijit_a11y")){return new dojox.grid._GridAvatar(this);}return _359.call(dojo.dnd.manager());};})();}if(!dojo._hasResource["dojox.grid._RowSelector"]){dojo._hasResource["dojox.grid._RowSelector"]=true;dojo.provide("dojox.grid._RowSelector");dojo.declare("dojox.grid._RowSelector",dojox.grid._View,{defaultWidth:"2em",noscroll:true,padBorderWidth:2,buildRendering:function(){this.inherited("buildRendering",arguments);this.scrollboxNode.style.overflow="hidden";this.headerNode.style.visibility="hidden";},getWidth:function(){return this.viewWidth||this.defaultWidth;},buildRowContent:function(_35a,_35b){var w=this.contentWidth||0;_35b.innerHTML="<table class=\"dojoxGridRowbarTable\" style=\"width:"+w+"px;height:1px;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" role=\"presentation\"><tr><td class=\"dojoxGridRowbarInner\">&nbsp;</td></tr></table>";},renderHeader:function(){},updateRow:function(){},resize:function(){this.adaptHeight();},adaptWidth:function(){if(!("contentWidth" in this)&&this.contentNode){this.contentWidth=this.contentNode.offsetWidth-this.padBorderWidth;}},doStyleRowNode:function(_35c,_35d){var n=["dojoxGridRowbar dojoxGridNonNormalizedCell"];if(this.grid.rows.isOver(_35c)){n.push("dojoxGridRowbarOver");}if(this.grid.selection.isSelected(_35c)){n.push("dojoxGridRowbarSelected");}_35d.className=n.join(" ");},domouseover:function(e){this.grid.onMouseOverRow(e);},domouseout:function(e){if(!this.isIntraRowEvent(e)){this.grid.onMouseOutRow(e);}}});}if(!dojo._hasResource["dojox.grid._Layout"]){dojo._hasResource["dojox.grid._Layout"]=true;dojo.provide("dojox.grid._Layout");dojo.declare("dojox.grid._Layout",null,{constructor:function(_35e){this.grid=_35e;},cells:[],structure:null,defaultWidth:"6em",moveColumn:function(_35f,_360,_361,_362,_363){var _364=this.structure[_35f].cells[0];var _365=this.structure[_360].cells[0];var cell=null;var _366=0;var _367=0;for(var i=0,c;c=_364[i];i++){if(c.index==_361){_366=i;break;}}cell=_364.splice(_366,1)[0];cell.view=this.grid.views.views[_360];for(i=0,c=null;c=_365[i];i++){if(c.index==_362){_367=i;break;}}if(!_363){_367+=1;}_365.splice(_367,0,cell);var _368=this.grid.getCell(this.grid.getSortIndex());if(_368){_368._currentlySorted=this.grid.getSortAsc();}this.cells=[];_361=0;var v;for(i=0;v=this.structure[i];i++){for(var j=0,cs;cs=v.cells[j];j++){for(var k=0;c=cs[k];k++){c.index=_361;this.cells.push(c);if("_currentlySorted" in c){var si=_361+1;si*=c._currentlySorted?1:-1;this.grid.sortInfo=si;delete c._currentlySorted;}_361++;}}}this.grid.setupHeaderMenu();},setColumnVisibility:function(_369,_36a){var cell=this.cells[_369];if(cell.hidden==_36a){cell.hidden=!_36a;var v=cell.view,w=v.viewWidth;if(w&&w!="auto"){v._togglingColumn=dojo.marginBox(cell.getHeaderNode()).w||0;}v.update();return true;}else{return false;}},addCellDef:function(_36b,_36c,_36d){var self=this;var _36e=function(_36f){var w=0;if(_36f.colSpan>1){w=0;}else{w=_36f.width||self._defaultCellProps.width||self.defaultWidth;if(!isNaN(w)){w=w+"em";}}return w;};var _370={grid:this.grid,subrow:_36b,layoutIndex:_36c,index:this.cells.length};if(_36d&&_36d instanceof dojox.grid.cells._Base){var _371=dojo.clone(_36d);_370.unitWidth=_36e(_371._props);_371=dojo.mixin(_371,this._defaultCellProps,_36d._props,_370);return _371;}var _372=_36d.type||this._defaultCellProps.type||dojox.grid.cells.Cell;_370.unitWidth=_36e(_36d);return new _372(dojo.mixin({},this._defaultCellProps,_36d,_370));},addRowDef:function(_373,_374){var _375=[];var _376=0,_377=0,_378=true;for(var i=0,def,cell;(def=_374[i]);i++){cell=this.addCellDef(_373,i,def);_375.push(cell);this.cells.push(cell);if(_378&&cell.relWidth){_376+=cell.relWidth;}else{if(cell.width){var w=cell.width;if(typeof w=="string"&&w.slice(-1)=="%"){_377+=window.parseInt(w,10);}else{if(w=="auto"){_378=false;}}}}}if(_376&&_378){dojo.forEach(_375,function(cell){if(cell.relWidth){cell.width=cell.unitWidth=((cell.relWidth/_376)*(100-_377))+"%";}});}return _375;},addRowsDef:function(_379){var _37a=[];if(dojo.isArray(_379)){if(dojo.isArray(_379[0])){for(var i=0,row;_379&&(row=_379[i]);i++){_37a.push(this.addRowDef(i,row));}}else{_37a.push(this.addRowDef(0,_379));}}return _37a;},addViewDef:function(_37b){this._defaultCellProps=_37b.defaultCell||{};if(_37b.width&&_37b.width=="auto"){delete _37b.width;}return dojo.mixin({},_37b,{cells:this.addRowsDef(_37b.rows||_37b.cells)});},setStructure:function(_37c){this.fieldIndex=0;this.cells=[];var s=this.structure=[];if(this.grid.rowSelector){var sel={type:dojox._scopeName+".grid._RowSelector"};if(dojo.isString(this.grid.rowSelector)){var _37d=this.grid.rowSelector;if(_37d=="false"){sel=null;}else{if(_37d!="true"){sel["width"]=_37d;}}}else{if(!this.grid.rowSelector){sel=null;}}if(sel){s.push(this.addViewDef(sel));}}var _37e=function(def){return ("name" in def||"field" in def||"get" in def);};var _37f=function(def){if(dojo.isArray(def)){if(dojo.isArray(def[0])||_37e(def[0])){return true;}}return false;};var _380=function(def){return (def!==null&&dojo.isObject(def)&&("cells" in def||"rows" in def||("type" in def&&!_37e(def))));};if(dojo.isArray(_37c)){var _381=false;for(var i=0,st;(st=_37c[i]);i++){if(_380(st)){_381=true;break;}}if(!_381){s.push(this.addViewDef({cells:_37c}));}else{for(i=0;(st=_37c[i]);i++){if(_37f(st)){s.push(this.addViewDef({cells:st}));}else{if(_380(st)){s.push(this.addViewDef(st));}}}}}else{if(_380(_37c)){s.push(this.addViewDef(_37c));}}this.cellCount=this.cells.length;this.grid.setupHeaderMenu();}});}if(!dojo._hasResource["dojox.grid._ViewManager"]){dojo._hasResource["dojox.grid._ViewManager"]=true;dojo.provide("dojox.grid._ViewManager");dojo.declare("dojox.grid._ViewManager",null,{constructor:function(_382){this.grid=_382;},defaultWidth:200,views:[],resize:function(){this.onEach("resize");},render:function(){this.onEach("render");},addView:function(_383){_383.idx=this.views.length;this.views.push(_383);},destroyViews:function(){for(var i=0,v;v=this.views[i];i++){v.destroy();}this.views=[];},getContentNodes:function(){var _384=[];for(var i=0,v;v=this.views[i];i++){_384.push(v.contentNode);}return _384;},forEach:function(_385){for(var i=0,v;v=this.views[i];i++){_385(v,i);}},onEach:function(_386,_387){_387=_387||[];for(var i=0,v;v=this.views[i];i++){if(_386 in v){v[_386].apply(v,_387);}}},normalizeHeaderNodeHeight:function(){var _388=[];for(var i=0,v;(v=this.views[i]);i++){if(v.headerContentNode.firstChild){_388.push(v.headerContentNode);}}this.normalizeRowNodeHeights(_388);},normalizeRowNodeHeights:function(_389){var h=0;var _38a=[];if(this.grid.rowHeight){h=this.grid.rowHeight;}else{if(_389.length<=1){return;}for(var i=0,n;(n=_389[i]);i++){if(!dojo.hasClass(n,"dojoxGridNonNormalizedCell")){_38a[i]=n.firstChild.offsetHeight;h=Math.max(h,_38a[i]);}}h=(h>=0?h:0);if(dojo.isMoz&&h){h++;}}for(i=0;(n=_389[i]);i++){if(_38a[i]!=h){n.firstChild.style.height=h+"px";}}},resetHeaderNodeHeight:function(){for(var i=0,v,n;(v=this.views[i]);i++){n=v.headerContentNode.firstChild;if(n){n.style.height="";}}},renormalizeRow:function(_38b){var _38c=[];for(var i=0,v,n;(v=this.views[i])&&(n=v.getRowNode(_38b));i++){n.firstChild.style.height="";_38c.push(n);}this.normalizeRowNodeHeights(_38c);},getViewWidth:function(_38d){return this.views[_38d].getWidth()||this.defaultWidth;},measureHeader:function(){this.resetHeaderNodeHeight();this.forEach(function(_38e){_38e.headerContentNode.style.height="";});var h=0;this.forEach(function(_38f){h=Math.max(_38f.headerNode.offsetHeight,h);});return h;},measureContent:function(){var h=0;this.forEach(function(_390){h=Math.max(_390.domNode.offsetHeight,h);});return h;},findClient:function(_391){var c=this.grid.elasticView||-1;if(c<0){for(var i=1,v;(v=this.views[i]);i++){if(v.viewWidth){for(i=1;(v=this.views[i]);i++){if(!v.viewWidth){c=i;break;}}break;}}}if(c<0){c=Math.floor(this.views.length/2);}return c;},arrange:function(l,w){var i,v,vw,len=this.views.length;var c=(w<=0?len:this.findClient());var _392=function(v,l){var ds=v.domNode.style;var hs=v.headerNode.style;if(!dojo._isBodyLtr()){ds.right=l+"px";if(dojo.isMoz){hs.right=l+v.getScrollbarWidth()+"px";hs.width=parseInt(hs.width,10)-v.getScrollbarWidth()+"px";}else{hs.right=l+"px";}}else{ds.left=l+"px";hs.left=l+"px";}ds.top=0+"px";hs.top=0;};for(i=0;(v=this.views[i])&&(i<c);i++){vw=this.getViewWidth(i);v.setSize(vw,0);_392(v,l);if(v.headerContentNode&&v.headerContentNode.firstChild){vw=v.getColumnsWidth()+v.getScrollbarWidth();}else{vw=v.domNode.offsetWidth;}l+=vw;}i++;var r=w;for(var j=len-1;(v=this.views[j])&&(i<=j);j--){vw=this.getViewWidth(j);v.setSize(vw,0);vw=v.domNode.offsetWidth;r-=vw;_392(v,r);}if(c<len){v=this.views[c];vw=Math.max(1,r-l);v.setSize(vw+"px",0);_392(v,l);}return l;},renderRow:function(_393,_394,_395){var _396=[];for(var i=0,v,n,_397;(v=this.views[i])&&(n=_394[i]);i++){_397=v.renderRow(_393);n.appendChild(_397);_396.push(_397);}if(!_395){this.normalizeRowNodeHeights(_396);}},rowRemoved:function(_398){this.onEach("rowRemoved",[_398]);},updateRow:function(_399,_39a){for(var i=0,v;v=this.views[i];i++){v.updateRow(_399);}if(!_39a){this.renormalizeRow(_399);}},updateRowStyles:function(_39b){this.onEach("updateRowStyles",[_39b]);},setScrollTop:function(_39c){var top=_39c;for(var i=0,v;v=this.views[i];i++){top=v.setScrollTop(_39c);if(dojo.isIE&&v.headerNode&&v.scrollboxNode){v.headerNode.scrollLeft=v.scrollboxNode.scrollLeft;}}return top;},getFirstScrollingView:function(){for(var i=0,v;(v=this.views[i]);i++){if(v.hasHScrollbar()||v.hasVScrollbar()){return v;}}return null;}});}if(!dojo._hasResource["dojox.grid._RowManager"]){dojo._hasResource["dojox.grid._RowManager"]=true;dojo.provide("dojox.grid._RowManager");(function(){var _39d=function(_39e,_39f){if(_39e.style.cssText==undefined){_39e.setAttribute("style",_39f);}else{_39e.style.cssText=_39f;}};dojo.declare("dojox.grid._RowManager",null,{constructor:function(_3a0){this.grid=_3a0;},linesToEms:2,overRow:-2,prepareStylingRow:function(_3a1,_3a2){return {index:_3a1,node:_3a2,odd:Boolean(_3a1&1),selected:!!this.grid.selection.isSelected(_3a1),over:this.isOver(_3a1),customStyles:"",customClasses:"dojoxGridRow"};},styleRowNode:function(_3a3,_3a4){var row=this.prepareStylingRow(_3a3,_3a4);this.grid.onStyleRow(row);this.applyStyles(row);},applyStyles:function(_3a5){var i=_3a5;i.node.className=i.customClasses;var h=i.node.style.height;_39d(i.node,i.customStyles+";"+(i.node._style||""));i.node.style.height=h;},updateStyles:function(_3a6){this.grid.updateRowStyles(_3a6);},setOverRow:function(_3a7){var last=this.overRow;this.overRow=_3a7;if((last!=this.overRow)&&(dojo.isString(last)||last>=0)){this.updateStyles(last);}this.updateStyles(this.overRow);},isOver:function(_3a8){return (this.overRow==_3a8&&!dojo.hasClass(this.grid.domNode,"dojoxGridColumnResizing"));}});})();}if(!dojo._hasResource["dojox.grid._FocusManager"]){dojo._hasResource["dojox.grid._FocusManager"]=true;dojo.provide("dojox.grid._FocusManager");dojo.declare("dojox.grid._FocusManager",null,{constructor:function(_3a9){this.grid=_3a9;this.cell=null;this.rowIndex=-1;this._connects=[];this.headerMenu=this.grid.headerMenu;this._connects.push(dojo.connect(this.grid.domNode,"onfocus",this,"doFocus"));this._connects.push(dojo.connect(this.grid.domNode,"onblur",this,"doBlur"));this._connects.push(dojo.connect(this.grid.domNode,"oncontextmenu",this,"doContextMenu"));this._connects.push(dojo.connect(this.grid.lastFocusNode,"onfocus",this,"doLastNodeFocus"));this._connects.push(dojo.connect(this.grid.lastFocusNode,"onblur",this,"doLastNodeBlur"));this._connects.push(dojo.connect(this.grid,"_onFetchComplete",this,"_delayedCellFocus"));this._connects.push(dojo.connect(this.grid,"postrender",this,"_delayedHeaderFocus"));},destroy:function(){dojo.forEach(this._connects,dojo.disconnect);delete this.grid;delete this.cell;},_colHeadNode:null,_colHeadFocusIdx:null,_contextMenuBindNode:null,tabbingOut:false,focusClass:"dojoxGridCellFocus",focusView:null,initFocusView:function(){this.focusView=this.grid.views.getFirstScrollingView()||this.focusView;this._initColumnHeaders();},isFocusCell:function(_3aa,_3ab){return (this.cell==_3aa)&&(this.rowIndex==_3ab);},isLastFocusCell:function(){if(this.cell){return (this.rowIndex==this.grid.rowCount-1)&&(this.cell.index==this.grid.layout.cellCount-1);}return false;},isFirstFocusCell:function(){if(this.cell){return (this.rowIndex===0)&&(this.cell.index===0);}return false;},isNoFocusCell:function(){return (this.rowIndex<0)||!this.cell;},isNavHeader:function(){return (!!this._colHeadNode);},getHeaderIndex:function(){if(this._colHeadNode){return dojo.indexOf(this._findHeaderCells(),this._colHeadNode);}else{return -1;}},_focusifyCellNode:function(_3ac){var n=this.cell&&this.cell.getNode(this.rowIndex);if(n){dojo.toggleClass(n,this.focusClass,_3ac);if(_3ac){var sl=this.scrollIntoView();try{if(!this.grid.edit.isEditing()){dojox.grid.util.fire(n,"focus");if(sl){this.cell.view.scrollboxNode.scrollLeft=sl;}}}catch(e){}}}},_delayedCellFocus:function(){if(this.isNavHeader()||!this.grid._focused){return;}var n=this.cell&&this.cell.getNode(this.rowIndex);if(n){try{if(!this.grid.edit.isEditing()){dojo.toggleClass(n,this.focusClass,true);this.blurHeader();dojox.grid.util.fire(n,"focus");}}catch(e){}}},_delayedHeaderFocus:function(){if(this.isNavHeader()){this.focusHeader();this.grid.domNode.focus();}},_initColumnHeaders:function(){var _3ad=this._findHeaderCells();for(var i=0;i<_3ad.length;i++){this._connects.push(dojo.connect(_3ad[i],"onfocus",this,"doColHeaderFocus"));this._connects.push(dojo.connect(_3ad[i],"onblur",this,"doColHeaderBlur"));}},_findHeaderCells:function(){var _3ae=dojo.query("th",this.grid.viewsHeaderNode);var _3af=[];for(var i=0;i<_3ae.length;i++){var _3b0=_3ae[i];var _3b1=dojo.hasAttr(_3b0,"tabIndex");var _3b2=dojo.attr(_3b0,"tabIndex");if(_3b1&&_3b2<0){_3af.push(_3b0);}}return _3af;},_setActiveColHeader:function(_3b3,_3b4,_3b5){dojo.attr(this.grid.domNode,"aria-activedescendant",_3b3.id);if(_3b5!=null&&_3b5>=0&&_3b5!=_3b4){dojo.toggleClass(this._findHeaderCells()[_3b5],this.focusClass,false);}dojo.toggleClass(_3b3,this.focusClass,true);this._colHeadNode=_3b3;this._colHeadFocusIdx=_3b4;this._scrollHeader(this._colHeadFocusIdx);},scrollIntoView:function(){var info=(this.cell?this._scrollInfo(this.cell):null);if(!info||!info.s){return null;}var rt=this.grid.scroller.findScrollTop(this.rowIndex);if(info.n&&info.sr){if(info.n.offsetLeft+info.n.offsetWidth>info.sr.l+info.sr.w){info.s.scrollLeft=info.n.offsetLeft+info.n.offsetWidth-info.sr.w;}else{if(info.n.offsetLeft<info.sr.l){info.s.scrollLeft=info.n.offsetLeft;}}}if(info.r&&info.sr){if(rt+info.r.offsetHeight>info.sr.t+info.sr.h){this.grid.setScrollTop(rt+info.r.offsetHeight-info.sr.h);}else{if(rt<info.sr.t){this.grid.setScrollTop(rt);}}}return info.s.scrollLeft;},_scrollInfo:function(cell,_3b6){if(cell){var cl=cell,sbn=cl.view.scrollboxNode,sbnr={w:sbn.clientWidth,l:sbn.scrollLeft,t:sbn.scrollTop,h:sbn.clientHeight},rn=cl.view.getRowNode(this.rowIndex);return {c:cl,s:sbn,sr:sbnr,n:(_3b6?_3b6:cell.getNode(this.rowIndex)),r:rn};}return null;},_scrollHeader:function(_3b7){var info=null;if(this._colHeadNode){var cell=this.grid.getCell(_3b7);info=this._scrollInfo(cell,cell.getNode(0));}if(info&&info.s&&info.sr&&info.n){var _3b8=info.sr.l+info.sr.w;if(info.n.offsetLeft+info.n.offsetWidth>_3b8){info.s.scrollLeft=info.n.offsetLeft+info.n.offsetWidth-info.sr.w;}else{if(info.n.offsetLeft<info.sr.l){info.s.scrollLeft=info.n.offsetLeft;}else{if(dojo.isIE<=7&&cell&&cell.view.headerNode){cell.view.headerNode.scrollLeft=info.s.scrollLeft;}}}}},_isHeaderHidden:function(){var _3b9=this.focusView;if(!_3b9){for(var i=0,_3ba;(_3ba=this.grid.views.views[i]);i++){if(_3ba.headerNode){_3b9=_3ba;break;}}}return (_3b9&&dojo.getComputedStyle(_3b9.headerNode).display=="none");},colSizeAdjust:function(e,_3bb,_3bc){var _3bd=this._findHeaderCells();var view=this.focusView;if(!view){for(var i=0,_3be;(_3be=this.grid.views.views[i]);i++){if(_3be.header.tableMap.map){view=_3be;break;}}}var _3bf=_3bd[_3bb];if(!view||(_3bb==_3bd.length-1&&_3bb===0)){return;}view.content.baseDecorateEvent(e);e.cellNode=_3bf;e.cellIndex=view.content.getCellNodeIndex(e.cellNode);e.cell=(e.cellIndex>=0?this.grid.getCell(e.cellIndex):null);if(view.header.canResize(e)){var _3c0={l:_3bc};var drag=view.header.colResizeSetup(e,false);view.header.doResizeColumn(drag,null,_3c0);view.update();}},styleRow:function(_3c1){return;},setFocusIndex:function(_3c2,_3c3){this.setFocusCell(this.grid.getCell(_3c3),_3c2);},setFocusCell:function(_3c4,_3c5){if(_3c4&&!this.isFocusCell(_3c4,_3c5)){this.tabbingOut=false;if(this._colHeadNode){this.blurHeader();}this._colHeadNode=this._colHeadFocusIdx=null;this.focusGridView();this._focusifyCellNode(false);this.cell=_3c4;this.rowIndex=_3c5;this._focusifyCellNode(true);}if(dojo.isOpera){setTimeout(dojo.hitch(this.grid,"onCellFocus",this.cell,this.rowIndex),1);}else{this.grid.onCellFocus(this.cell,this.rowIndex);}},next:function(){if(this.cell){var row=this.rowIndex,col=this.cell.index+1,cc=this.grid.layout.cellCount-1,rc=this.grid.rowCount-1;if(col>cc){col=0;row++;}if(row>rc){col=cc;row=rc;}if(this.grid.edit.isEditing()){var _3c6=this.grid.getCell(col);if(!this.isLastFocusCell()&&!_3c6.editable){this.cell=_3c6;this.rowIndex=row;this.next();return;}}this.setFocusIndex(row,col);}},previous:function(){if(this.cell){var row=(this.rowIndex||0),col=(this.cell.index||0)-1;if(col<0){col=this.grid.layout.cellCount-1;row--;}if(row<0){row=0;col=0;}if(this.grid.edit.isEditing()){var _3c7=this.grid.getCell(col);if(!this.isFirstFocusCell()&&!_3c7.editable){this.cell=_3c7;this.rowIndex=row;this.previous();return;}}this.setFocusIndex(row,col);}},move:function(_3c8,_3c9){var _3ca=_3c9<0?-1:1;if(this.isNavHeader()){var _3cb=this._findHeaderCells();var _3cc=currentIdx=dojo.indexOf(_3cb,this._colHeadNode);currentIdx+=_3c9;while(currentIdx>=0&&currentIdx<_3cb.length&&_3cb[currentIdx].style.display=="none"){currentIdx+=_3ca;}if((currentIdx>=0)&&(currentIdx<_3cb.length)){this._setActiveColHeader(_3cb[currentIdx],currentIdx,_3cc);}}else{if(this.cell){var sc=this.grid.scroller,r=this.rowIndex,rc=this.grid.rowCount-1,row=Math.min(rc,Math.max(0,r+_3c8));if(_3c8){if(_3c8>0){if(row>sc.getLastPageRow(sc.page)){this.grid.setScrollTop(this.grid.scrollTop+sc.findScrollTop(row)-sc.findScrollTop(r));}}else{if(_3c8<0){if(row<=sc.getPageRow(sc.page)){this.grid.setScrollTop(this.grid.scrollTop-sc.findScrollTop(r)-sc.findScrollTop(row));}}}}var cc=this.grid.layout.cellCount-1,i=this.cell.index,col=Math.min(cc,Math.max(0,i+_3c9));var cell=this.grid.getCell(col);while(col>=0&&col<cc&&cell&&cell.hidden===true){col+=_3ca;cell=this.grid.getCell(col);}if(!cell||cell.hidden===true){col=i;}this.setFocusIndex(row,col);if(_3c8){this.grid.updateRow(r);}}}},previousKey:function(e){if(this.grid.edit.isEditing()){dojo.stopEvent(e);this.previous();}else{if(!this.isNavHeader()&&!this._isHeaderHidden()){this.grid.domNode.focus();dojo.stopEvent(e);}else{this.tabOut(this.grid.domNode);if(this._colHeadFocusIdx!=null){dojo.toggleClass(this._findHeaderCells()[this._colHeadFocusIdx],this.focusClass,false);this._colHeadFocusIdx=null;}this._focusifyCellNode(false);}}},nextKey:function(e){var _3cd=(this.grid.rowCount===0);if(e.target===this.grid.domNode&&this._colHeadFocusIdx==null){this.focusHeader();dojo.stopEvent(e);}else{if(this.isNavHeader()){this.blurHeader();if(!this.findAndFocusGridCell()){this.tabOut(this.grid.lastFocusNode);}this._colHeadNode=this._colHeadFocusIdx=null;}else{if(this.grid.edit.isEditing()){dojo.stopEvent(e);this.next();}else{this.tabOut(this.grid.lastFocusNode);}}}},tabOut:function(_3ce){this.tabbingOut=true;_3ce.focus();},focusGridView:function(){dojox.grid.util.fire(this.focusView,"focus");},focusGrid:function(_3cf){this.focusGridView();this._focusifyCellNode(true);},findAndFocusGridCell:function(){var _3d0=true;var _3d1=(this.grid.rowCount===0);if(this.isNoFocusCell()&&!_3d1){var _3d2=0;var cell=this.grid.getCell(_3d2);if(cell.hidden){_3d2=this.isNavHeader()?this._colHeadFocusIdx:0;}this.setFocusIndex(0,_3d2);}else{if(this.cell&&!_3d1){if(this.focusView&&!this.focusView.rowNodes[this.rowIndex]){this.grid.scrollToRow(this.rowIndex);}this.focusGrid();}else{_3d0=false;}}this._colHeadNode=this._colHeadFocusIdx=null;return _3d0;},focusHeader:function(){var _3d3=this._findHeaderCells();var _3d4=this._colHeadFocusIdx;if(this._isHeaderHidden()){this.findAndFocusGridCell();}else{if(!this._colHeadFocusIdx){if(this.isNoFocusCell()){this._colHeadFocusIdx=0;}else{this._colHeadFocusIdx=this.cell.index;}}}this._colHeadNode=_3d3[this._colHeadFocusIdx];while(this._colHeadNode&&this._colHeadFocusIdx>=0&&this._colHeadFocusIdx<_3d3.length&&this._colHeadNode.style.display=="none"){this._colHeadFocusIdx++;this._colHeadNode=_3d3[this._colHeadFocusIdx];}if(this._colHeadNode&&this._colHeadNode.style.display!="none"){if(this.headerMenu&&this._contextMenuBindNode!=this.grid.domNode){this.headerMenu.unBindDomNode(this.grid.viewsHeaderNode);this.headerMenu.bindDomNode(this.grid.domNode);this._contextMenuBindNode=this.grid.domNode;}this._setActiveColHeader(this._colHeadNode,this._colHeadFocusIdx,_3d4);this._scrollHeader(this._colHeadFocusIdx);this._focusifyCellNode(false);}else{this.findAndFocusGridCell();}},blurHeader:function(){dojo.removeClass(this._colHeadNode,this.focusClass);dojo.removeAttr(this.grid.domNode,"aria-activedescendant");if(this.headerMenu&&this._contextMenuBindNode==this.grid.domNode){var _3d5=this.grid.viewsHeaderNode;this.headerMenu.unBindDomNode(this.grid.domNode);this.headerMenu.bindDomNode(_3d5);this._contextMenuBindNode=_3d5;}},doFocus:function(e){if(e&&e.target!=e.currentTarget){dojo.stopEvent(e);return;}if(!this.tabbingOut){this.focusHeader();}this.tabbingOut=false;dojo.stopEvent(e);},doBlur:function(e){dojo.stopEvent(e);},doContextMenu:function(e){if(!this.headerMenu){dojo.stopEvent(e);}},doLastNodeFocus:function(e){if(this.tabbingOut){this._focusifyCellNode(false);}else{if(this.grid.rowCount>0){if(this.isNoFocusCell()){this.setFocusIndex(0,0);}this._focusifyCellNode(true);}else{this.focusHeader();}}this.tabbingOut=false;dojo.stopEvent(e);},doLastNodeBlur:function(e){dojo.stopEvent(e);},doColHeaderFocus:function(e){this._setActiveColHeader(e.target,dojo.attr(e.target,"idx"),this._colHeadFocusIdx);this._scrollHeader(this.getHeaderIndex());dojo.stopEvent(e);},doColHeaderBlur:function(e){dojo.toggleClass(e.target,this.focusClass,false);}});}if(!dojo._hasResource["dojox.grid._EditManager"]){dojo._hasResource["dojox.grid._EditManager"]=true;dojo.provide("dojox.grid._EditManager");dojo.declare("dojox.grid._EditManager",null,{constructor:function(_3d6){this.grid=_3d6;this.connections=[];if(dojo.isIE){this.connections.push(dojo.connect(document.body,"onfocus",dojo.hitch(this,"_boomerangFocus")));}},info:{},destroy:function(){dojo.forEach(this.connections,dojo.disconnect);},cellFocus:function(_3d7,_3d8){if(this.grid.singleClickEdit||this.isEditRow(_3d8)){this.setEditCell(_3d7,_3d8);}else{this.apply();}if(this.isEditing()||(_3d7&&_3d7.editable&&_3d7.alwaysEditing)){this._focusEditor(_3d7,_3d8);}},rowClick:function(e){if(this.isEditing()&&!this.isEditRow(e.rowIndex)){this.apply();}},styleRow:function(_3d9){if(_3d9.index==this.info.rowIndex){_3d9.customClasses+=" dojoxGridRowEditing";}},dispatchEvent:function(e){var c=e.cell,ed=(c&&c["editable"])?c:0;return ed&&ed.dispatchEvent(e.dispatch,e);},isEditing:function(){return this.info.rowIndex!==undefined;},isEditCell:function(_3da,_3db){return (this.info.rowIndex===_3da)&&(this.info.cell.index==_3db);},isEditRow:function(_3dc){return this.info.rowIndex===_3dc;},setEditCell:function(_3dd,_3de){if(!this.isEditCell(_3de,_3dd.index)&&this.grid.canEdit&&this.grid.canEdit(_3dd,_3de)){this.start(_3dd,_3de,this.isEditRow(_3de)||_3dd.editable);}},_focusEditor:function(_3df,_3e0){dojox.grid.util.fire(_3df,"focus",[_3e0]);},focusEditor:function(){if(this.isEditing()){this._focusEditor(this.info.cell,this.info.rowIndex);}},_boomerangWindow:500,_shouldCatchBoomerang:function(){return this._catchBoomerang>new Date().getTime();},_boomerangFocus:function(){if(this._shouldCatchBoomerang()){this.grid.focus.focusGrid();this.focusEditor();this._catchBoomerang=0;}},_doCatchBoomerang:function(){if(dojo.isIE){this._catchBoomerang=new Date().getTime()+this._boomerangWindow;}},start:function(_3e1,_3e2,_3e3){this.grid.beginUpdate();this.editorApply();if(this.isEditing()&&!this.isEditRow(_3e2)){this.applyRowEdit();this.grid.updateRow(_3e2);}if(_3e3){this.info={cell:_3e1,rowIndex:_3e2};this.grid.doStartEdit(_3e1,_3e2);this.grid.updateRow(_3e2);}else{this.info={};}this.grid.endUpdate();this.grid.focus.focusGrid();this._focusEditor(_3e1,_3e2);this._doCatchBoomerang();},_editorDo:function(_3e4){var c=this.info.cell;if(c&&c.editable){c[_3e4](this.info.rowIndex);}},editorApply:function(){this._editorDo("apply");},editorCancel:function(){this._editorDo("cancel");},applyCellEdit:function(_3e5,_3e6,_3e7){if(this.grid.canEdit(_3e6,_3e7)){this.grid.doApplyCellEdit(_3e5,_3e7,_3e6.field);}},applyRowEdit:function(){this.grid.doApplyEdit(this.info.rowIndex,this.info.cell.field);},apply:function(){if(this.isEditing()){this.grid.beginUpdate();this.editorApply();this.applyRowEdit();this.info={};this.grid.endUpdate();this.grid.focus.focusGrid();this._doCatchBoomerang();}},cancel:function(){if(this.isEditing()){this.grid.beginUpdate();this.editorCancel();this.info={};this.grid.endUpdate();this.grid.focus.focusGrid();this._doCatchBoomerang();}},save:function(_3e8,_3e9){var c=this.info.cell;if(this.isEditRow(_3e8)&&(!_3e9||c.view==_3e9)&&c.editable){c.save(c,this.info.rowIndex);}},restore:function(_3ea,_3eb){var c=this.info.cell;if(this.isEditRow(_3eb)&&c.view==_3ea&&c.editable){c.restore(c,this.info.rowIndex);}}});}if(!dojo._hasResource["dojox.grid.Selection"]){dojo._hasResource["dojox.grid.Selection"]=true;dojo.provide("dojox.grid.Selection");dojo.declare("dojox.grid.Selection",null,{constructor:function(_3ec){this.grid=_3ec;this.selected=[];this.setMode(_3ec.selectionMode);},mode:"extended",selected:null,updating:0,selectedIndex:-1,setMode:function(mode){if(this.selected.length){this.deselectAll();}if(mode!="extended"&&mode!="multiple"&&mode!="single"&&mode!="none"){this.mode="extended";}else{this.mode=mode;}},onCanSelect:function(_3ed){return this.grid.onCanSelect(_3ed);},onCanDeselect:function(_3ee){return this.grid.onCanDeselect(_3ee);},onSelected:function(_3ef){},onDeselected:function(_3f0){},onChanging:function(){},onChanged:function(){},isSelected:function(_3f1){if(this.mode=="none"){return false;}return this.selected[_3f1];},getFirstSelected:function(){if(!this.selected.length||this.mode=="none"){return -1;}for(var i=0,l=this.selected.length;i<l;i++){if(this.selected[i]){return i;}}return -1;},getNextSelected:function(_3f2){if(this.mode=="none"){return -1;}for(var i=_3f2+1,l=this.selected.length;i<l;i++){if(this.selected[i]){return i;}}return -1;},getSelected:function(){var _3f3=[];for(var i=0,l=this.selected.length;i<l;i++){if(this.selected[i]){_3f3.push(i);}}return _3f3;},getSelectedCount:function(){var c=0;for(var i=0;i<this.selected.length;i++){if(this.selected[i]){c++;}}return c;},_beginUpdate:function(){if(this.updating===0){this.onChanging();}this.updating++;},_endUpdate:function(){this.updating--;if(this.updating===0){this.onChanged();}},select:function(_3f4){if(this.mode=="none"){return;}if(this.mode!="multiple"){this.deselectAll(_3f4);this.addToSelection(_3f4);}else{this.toggleSelect(_3f4);}},addToSelection:function(_3f5){if(this.mode=="none"){return;}if(dojo.isArray(_3f5)){dojo.forEach(_3f5,this.addToSelection,this);return;}_3f5=Number(_3f5);if(this.selected[_3f5]){this.selectedIndex=_3f5;}else{if(this.onCanSelect(_3f5)!==false){this.selectedIndex=_3f5;var _3f6=this.grid.getRowNode(_3f5);if(_3f6){dojo.attr(_3f6,"aria-selected","true");}this._beginUpdate();this.selected[_3f5]=true;this.onSelected(_3f5);this._endUpdate();}}},deselect:function(_3f7){if(this.mode=="none"){return;}if(dojo.isArray(_3f7)){dojo.forEach(_3f7,this.deselect,this);return;}_3f7=Number(_3f7);if(this.selectedIndex==_3f7){this.selectedIndex=-1;}if(this.selected[_3f7]){if(this.onCanDeselect(_3f7)===false){return;}var _3f8=this.grid.getRowNode(_3f7);if(_3f8){dojo.attr(_3f8,"aria-selected","false");}this._beginUpdate();delete this.selected[_3f7];this.onDeselected(_3f7);this._endUpdate();}},setSelected:function(_3f9,_3fa){this[(_3fa?"addToSelection":"deselect")](_3f9);},toggleSelect:function(_3fb){if(dojo.isArray(_3fb)){dojo.forEach(_3fb,this.toggleSelect,this);return;}this.setSelected(_3fb,!this.selected[_3fb]);},_range:function(_3fc,inTo,func){var s=(_3fc>=0?_3fc:inTo),e=inTo;if(s>e){e=s;s=inTo;}for(var i=s;i<=e;i++){func(i);}},selectRange:function(_3fd,inTo){this._range(_3fd,inTo,dojo.hitch(this,"addToSelection"));},deselectRange:function(_3fe,inTo){this._range(_3fe,inTo,dojo.hitch(this,"deselect"));},insert:function(_3ff){this.selected.splice(_3ff,0,false);if(this.selectedIndex>=_3ff){this.selectedIndex++;}},remove:function(_400){this.selected.splice(_400,1);if(this.selectedIndex>=_400){this.selectedIndex--;}},deselectAll:function(_401){for(var i in this.selected){if((i!=_401)&&(this.selected[i]===true)){this.deselect(i);}}},clickSelect:function(_402,_403,_404){if(this.mode=="none"){return;}this._beginUpdate();if(this.mode!="extended"){this.select(_402);}else{var _405=this.selectedIndex;if(!_403){this.deselectAll(_402);}if(_404){this.selectRange(_405,_402);}else{if(_403){this.toggleSelect(_402);}else{this.addToSelection(_402);}}}this._endUpdate();},clickSelectEvent:function(e){this.clickSelect(e.rowIndex,dojo.isCopyKey(e),e.shiftKey);},clear:function(){this._beginUpdate();this.deselectAll();this._endUpdate();}});}if(!dojo._hasResource["dojox.grid._Events"]){dojo._hasResource["dojox.grid._Events"]=true;dojo.provide("dojox.grid._Events");dojo.declare("dojox.grid._Events",null,{cellOverClass:"dojoxGridCellOver",onKeyEvent:function(e){this.dispatchKeyEvent(e);},onContentEvent:function(e){this.dispatchContentEvent(e);},onHeaderEvent:function(e){this.dispatchHeaderEvent(e);},onStyleRow:function(_406){var i=_406;i.customClasses+=(i.odd?" dojoxGridRowOdd":"")+(i.selected?" dojoxGridRowSelected":"")+(i.over?" dojoxGridRowOver":"");this.focus.styleRow(_406);this.edit.styleRow(_406);},onKeyDown:function(e){if(e.altKey||e.metaKey){return;}var dk=dojo.keys;var _407;switch(e.keyCode){case dk.ESCAPE:this.edit.cancel();break;case dk.ENTER:if(!this.edit.isEditing()){_407=this.focus.getHeaderIndex();if(_407>=0){this.setSortIndex(_407);break;}else{this.selection.clickSelect(this.focus.rowIndex,dojo.isCopyKey(e),e.shiftKey);}dojo.stopEvent(e);}if(!e.shiftKey){var _408=this.edit.isEditing();this.edit.apply();if(!_408){this.edit.setEditCell(this.focus.cell,this.focus.rowIndex);}}if(!this.edit.isEditing()){var _409=this.focus.focusView||this.views.views[0];_409.content.decorateEvent(e);this.onRowClick(e);}break;case dk.SPACE:if(!this.edit.isEditing()){_407=this.focus.getHeaderIndex();if(_407>=0){this.setSortIndex(_407);break;}else{this.selection.clickSelect(this.focus.rowIndex,dojo.isCopyKey(e),e.shiftKey);}dojo.stopEvent(e);}break;case dk.TAB:this.focus[e.shiftKey?"previousKey":"nextKey"](e);break;case dk.LEFT_ARROW:case dk.RIGHT_ARROW:if(!this.edit.isEditing()){var _40a=e.keyCode;dojo.stopEvent(e);_407=this.focus.getHeaderIndex();if(_407>=0&&(e.shiftKey&&e.ctrlKey)){this.focus.colSizeAdjust(e,_407,(_40a==dk.LEFT_ARROW?-1:1)*5);}else{var _40b=(_40a==dk.LEFT_ARROW)?1:-1;if(dojo._isBodyLtr()){_40b*=-1;}this.focus.move(0,_40b);}}break;case dk.UP_ARROW:if(!this.edit.isEditing()&&this.focus.rowIndex!==0){dojo.stopEvent(e);this.focus.move(-1,0);}break;case dk.DOWN_ARROW:if(!this.edit.isEditing()&&this.focus.rowIndex+1!=this.rowCount){dojo.stopEvent(e);this.focus.move(1,0);}break;case dk.PAGE_UP:if(!this.edit.isEditing()&&this.focus.rowIndex!==0){dojo.stopEvent(e);if(this.focus.rowIndex!=this.scroller.firstVisibleRow+1){this.focus.move(this.scroller.firstVisibleRow-this.focus.rowIndex,0);}else{this.setScrollTop(this.scroller.findScrollTop(this.focus.rowIndex-1));this.focus.move(this.scroller.firstVisibleRow-this.scroller.lastVisibleRow+1,0);}}break;case dk.PAGE_DOWN:if(!this.edit.isEditing()&&this.focus.rowIndex+1!=this.rowCount){dojo.stopEvent(e);if(this.focus.rowIndex!=this.scroller.lastVisibleRow-1){this.focus.move(this.scroller.lastVisibleRow-this.focus.rowIndex-1,0);}else{this.setScrollTop(this.scroller.findScrollTop(this.focus.rowIndex+1));this.focus.move(this.scroller.lastVisibleRow-this.scroller.firstVisibleRow-1,0);}}break;default:break;}},onMouseOver:function(e){e.rowIndex==-1?this.onHeaderCellMouseOver(e):this.onCellMouseOver(e);},onMouseOut:function(e){e.rowIndex==-1?this.onHeaderCellMouseOut(e):this.onCellMouseOut(e);},onMouseDown:function(e){e.rowIndex==-1?this.onHeaderCellMouseDown(e):this.onCellMouseDown(e);},onMouseOverRow:function(e){if(!this.rows.isOver(e.rowIndex)){this.rows.setOverRow(e.rowIndex);e.rowIndex==-1?this.onHeaderMouseOver(e):this.onRowMouseOver(e);}},onMouseOutRow:function(e){if(this.rows.isOver(-1)){this.onHeaderMouseOut(e);}else{if(!this.rows.isOver(-2)){this.rows.setOverRow(-2);this.onRowMouseOut(e);}}},onMouseDownRow:function(e){if(e.rowIndex!=-1){this.onRowMouseDown(e);}},onCellMouseOver:function(e){if(e.cellNode){dojo.addClass(e.cellNode,this.cellOverClass);}},onCellMouseOut:function(e){if(e.cellNode){dojo.removeClass(e.cellNode,this.cellOverClass);}},onCellMouseDown:function(e){},onCellClick:function(e){this._click[0]=this._click[1];this._click[1]=e;if(!this.edit.isEditCell(e.rowIndex,e.cellIndex)){this.focus.setFocusCell(e.cell,e.rowIndex);}this.onRowClick(e);},onCellDblClick:function(e){if(this._click.length>1&&dojo.isIE){this.edit.setEditCell(this._click[1].cell,this._click[1].rowIndex);}else{if(this._click.length>1&&this._click[0].rowIndex!=this._click[1].rowIndex){this.edit.setEditCell(this._click[0].cell,this._click[0].rowIndex);}else{this.edit.setEditCell(e.cell,e.rowIndex);}}this.onRowDblClick(e);},onCellContextMenu:function(e){this.onRowContextMenu(e);},onCellFocus:function(_40c,_40d){this.edit.cellFocus(_40c,_40d);},onRowClick:function(e){this.edit.rowClick(e);this.selection.clickSelectEvent(e);},onRowDblClick:function(e){},onRowMouseOver:function(e){},onRowMouseOut:function(e){},onRowMouseDown:function(e){},onRowContextMenu:function(e){dojo.stopEvent(e);},onHeaderMouseOver:function(e){},onHeaderMouseOut:function(e){},onHeaderCellMouseOver:function(e){if(e.cellNode){dojo.addClass(e.cellNode,this.cellOverClass);}},onHeaderCellMouseOut:function(e){if(e.cellNode){dojo.removeClass(e.cellNode,this.cellOverClass);}},onHeaderCellMouseDown:function(e){},onHeaderClick:function(e){},onHeaderCellClick:function(e){this.setSortIndex(e.cell.index);this.onHeaderClick(e);},onHeaderDblClick:function(e){},onHeaderCellDblClick:function(e){this.onHeaderDblClick(e);},onHeaderCellContextMenu:function(e){this.onHeaderContextMenu(e);},onHeaderContextMenu:function(e){if(!this.headerMenu){dojo.stopEvent(e);}},onStartEdit:function(_40e,_40f){},onApplyCellEdit:function(_410,_411,_412){},onCancelEdit:function(_413){},onApplyEdit:function(_414){},onCanSelect:function(_415){return true;},onCanDeselect:function(_416){return true;},onSelected:function(_417){this.updateRowStyles(_417);},onDeselected:function(_418){this.updateRowStyles(_418);},onSelectionChanged:function(){}});}if(!dojo._hasResource["dojo.i18n"]){dojo._hasResource["dojo.i18n"]=true;dojo.provide("dojo.i18n");dojo.i18n.getLocalization=function(_419,_41a,_41b){_41b=dojo.i18n.normalizeLocale(_41b);var _41c=_41b.split("-");var _41d=[_419,"nls",_41a].join(".");var _41e=dojo._loadedModules[_41d];if(_41e){var _41f;for(var i=_41c.length;i>0;i--){var loc=_41c.slice(0,i).join("_");if(_41e[loc]){_41f=_41e[loc];break;}}if(!_41f){_41f=_41e.ROOT;}if(_41f){var _420=function(){};_420.prototype=_41f;return new _420();}}throw new Error("Bundle not found: "+_41a+" in "+_419+" , locale="+_41b);};dojo.i18n.normalizeLocale=function(_421){var _422=_421?_421.toLowerCase():dojo.locale;if(_422=="root"){_422="ROOT";}return _422;};dojo.i18n._requireLocalization=function(_423,_424,_425,_426){var _427=dojo.i18n.normalizeLocale(_425);var _428=[_423,"nls",_424].join(".");var _429="";if(_426){var _42a=_426.split(",");for(var i=0;i<_42a.length;i++){if(_427["indexOf"](_42a[i])==0){if(_42a[i].length>_429.length){_429=_42a[i];}}}if(!_429){_429="ROOT";}}var _42b=_426?_429:_427;var _42c=dojo._loadedModules[_428];var _42d=null;if(_42c){if(dojo.config.localizationComplete&&_42c._built){return;}var _42e=_42b.replace(/-/g,"_");var _42f=_428+"."+_42e;_42d=dojo._loadedModules[_42f];}if(!_42d){_42c=dojo["provide"](_428);var syms=dojo._getModuleSymbols(_423);var _430=syms.concat("nls").join("/");var _431;dojo.i18n._searchLocalePath(_42b,_426,function(loc){var _432=loc.replace(/-/g,"_");var _433=_428+"."+_432;var _434=false;if(!dojo._loadedModules[_433]){dojo["provide"](_433);var _435=[_430];if(loc!="ROOT"){_435.push(loc);}_435.push(_424);var _436=_435.join("/")+".js";_434=dojo._loadPath(_436,null,function(hash){var _437=function(){};_437.prototype=_431;_42c[_432]=new _437();for(var j in hash){_42c[_432][j]=hash[j];}});}else{_434=true;}if(_434&&_42c[_432]){_431=_42c[_432];}else{_42c[_432]=_431;}if(_426){return true;}});}if(_426&&_427!=_429){_42c[_427.replace(/-/g,"_")]=_42c[_429.replace(/-/g,"_")];}};(function(){var _438=dojo.config.extraLocale;if(_438){if(!_438 instanceof Array){_438=[_438];}var req=dojo.i18n._requireLocalization;dojo.i18n._requireLocalization=function(m,b,_439,_43a){req(m,b,_439,_43a);if(_439){return;}for(var i=0;i<_438.length;i++){req(m,b,_438[i],_43a);}};}})();dojo.i18n._searchLocalePath=function(_43b,down,_43c){_43b=dojo.i18n.normalizeLocale(_43b);var _43d=_43b.split("-");var _43e=[];for(var i=_43d.length;i>0;i--){_43e.push(_43d.slice(0,i).join("-"));}_43e.push(false);if(down){_43e.reverse();}for(var j=_43e.length-1;j>=0;j--){var loc=_43e[j]||"ROOT";var stop=_43c(loc);if(stop){break;}}};dojo.i18n._preloadLocalizations=function(_43f,_440){function _441(_442){_442=dojo.i18n.normalizeLocale(_442);dojo.i18n._searchLocalePath(_442,true,function(loc){for(var i=0;i<_440.length;i++){if(_440[i]==loc){dojo["require"](_43f+"_"+loc);return true;}}return false;});};_441();var _443=dojo.config.extraLocale||[];for(var i=0;i<_443.length;i++){_441(_443[i]);}};}if(!dojo._hasResource["dojox.grid._Grid"]){dojo._hasResource["dojox.grid._Grid"]=true;dojo.provide("dojox.grid._Grid");(function(){if(!dojo.isCopyKey){dojo.isCopyKey=dojo.dnd.getCopyKeyState;}dojo.declare("dojox.grid._Grid",[dijit._Widget,dijit._Templated,dojox.grid._Events],{templateString:"<div class=\"dojoxGrid\" hidefocus=\"hidefocus\" wairole=\"grid\" dojoAttachEvent=\"onmouseout:_mouseOut\">\n\t<div class=\"dojoxGridMasterHeader\" dojoAttachPoint=\"viewsHeaderNode\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterView\" dojoAttachPoint=\"viewsNode\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterMessages\" style=\"display: none;\" dojoAttachPoint=\"messagesNode\"></div>\n\t<span dojoAttachPoint=\"lastFocusNode\" tabindex=\"0\"></span>\n</div>\n",classTag:"dojoxGrid",get:function(_444){},rowCount:5,keepRows:75,rowsPerPage:25,autoWidth:false,initialWidth:"",autoHeight:"",rowHeight:0,autoRender:true,defaultHeight:"15em",height:"",structure:null,elasticView:-1,singleClickEdit:false,selectionMode:"extended",rowSelector:"",columnReordering:false,headerMenu:null,placeholderLabel:"GridColumns",selectable:false,_click:null,loadingMessage:"<span class='dojoxGridLoading'>${loadingState}</span>",errorMessage:"<span class='dojoxGridError'>${errorState}</span>",noDataMessage:"",escapeHTMLInData:true,formatterScope:null,editable:false,sortInfo:0,themeable:true,_placeholders:null,_layoutClass:dojox.grid._Layout,buildRendering:function(){this.inherited(arguments);if(this.get==dojox.grid._Grid.prototype.get){this.get=null;}if(!this.domNode.getAttribute("tabIndex")){this.domNode.tabIndex="0";}this.createScroller();this.createLayout();this.createViews();this.createManagers();this.createSelection();this.connect(this.selection,"onSelected","onSelected");this.connect(this.selection,"onDeselected","onDeselected");this.connect(this.selection,"onChanged","onSelectionChanged");dojox.html.metrics.initOnFontResize();this.connect(dojox.html.metrics,"onFontResize","textSizeChanged");dojox.grid.util.funnelEvents(this.domNode,this,"doKeyEvent",dojox.grid.util.keyEvents);if(this.selectionMode!="none"){dojo.attr(this.domNode,"aria-multiselectable",this.selectionMode=="single"?"false":"true");}},postMixInProperties:function(){this.inherited(arguments);var _445=dojo.i18n.getLocalization("dijit","loading",this.lang);this.loadingMessage=dojo.string.substitute(this.loadingMessage,_445);this.errorMessage=dojo.string.substitute(this.errorMessage,_445);if(this.srcNodeRef&&this.srcNodeRef.style.height){this.height=this.srcNodeRef.style.height;}this._setAutoHeightAttr(this.autoHeight,true);this.lastScrollTop=this.scrollTop=0;},postCreate:function(){this._placeholders=[];this._setHeaderMenuAttr(this.headerMenu);this._setStructureAttr(this.structure);this._click=[];this.inherited(arguments);if(this.domNode&&this.autoWidth&&this.initialWidth){this.domNode.style.width=this.initialWidth;}if(this.domNode&&!this.editable){dojo.attr(this.domNode,"aria-readonly","true");}},destroy:function(){this.domNode.onReveal=null;this.domNode.onSizeChange=null;delete this._click;this.edit.destroy();delete this.edit;this.views.destroyViews();if(this.scroller){this.scroller.destroy();delete this.scroller;}if(this.focus){this.focus.destroy();delete this.focus;}if(this.headerMenu&&this._placeholders.length){dojo.forEach(this._placeholders,function(p){p.unReplace(true);});this.headerMenu.unBindDomNode(this.viewsHeaderNode);}this.inherited(arguments);},_setAutoHeightAttr:function(ah,_446){if(typeof ah=="string"){if(!ah||ah=="false"){ah=false;}else{if(ah=="true"){ah=true;}else{ah=window.parseInt(ah,10);}}}if(typeof ah=="number"){if(isNaN(ah)){ah=false;}if(ah<0){ah=true;}else{if(ah===0){ah=false;}}}this.autoHeight=ah;if(typeof ah=="boolean"){this._autoHeight=ah;}else{if(typeof ah=="number"){this._autoHeight=(ah>=this.attr("rowCount"));}else{this._autoHeight=false;}}if(this._started&&!_446){this.render();}},_getRowCountAttr:function(){return this.updating&&this.invalidated&&this.invalidated.rowCount!=undefined?this.invalidated.rowCount:this.rowCount;},textSizeChanged:function(){this.render();},sizeChange:function(){this.update();},createManagers:function(){this.rows=new dojox.grid._RowManager(this);this.focus=new dojox.grid._FocusManager(this);this.edit=new dojox.grid._EditManager(this);},createSelection:function(){this.selection=new dojox.grid.Selection(this);},createScroller:function(){this.scroller=new dojox.grid._Scroller();this.scroller.grid=this;this.scroller.renderRow=dojo.hitch(this,"renderRow");this.scroller.removeRow=dojo.hitch(this,"rowRemoved");},createLayout:function(){this.layout=new this._layoutClass(this);this.connect(this.layout,"moveColumn","onMoveColumn");},onMoveColumn:function(){this.render();},onResizeColumn:function(_447){},createViews:function(){this.views=new dojox.grid._ViewManager(this);this.views.createView=dojo.hitch(this,"createView");},createView:function(_448,idx){var c=dojo.getObject(_448);var view=new c({grid:this,index:idx});this.viewsNode.appendChild(view.domNode);this.viewsHeaderNode.appendChild(view.headerNode);this.views.addView(view);return view;},buildViews:function(){for(var i=0,vs;(vs=this.layout.structure[i]);i++){this.createView(vs.type||dojox._scopeName+".grid._View",i).setStructure(vs);}this.scroller.setContentNodes(this.views.getContentNodes());},_setStructureAttr:function(_449){var s=_449;if(s&&dojo.isString(s)){dojo.deprecated("dojox.grid._Grid.attr('structure', 'objVar')","use dojox.grid._Grid.attr('structure', objVar) instead","2.0");s=dojo.getObject(s);}this.structure=s;if(!s){if(this.layout.structure){s=this.layout.structure;}else{return;}}this.views.destroyViews();if(s!==this.layout.structure){this.layout.setStructure(s);}this._structureChanged();},setStructure:function(_44a){dojo.deprecated("dojox.grid._Grid.setStructure(obj)","use dojox.grid._Grid.attr('structure', obj) instead.","2.0");this._setStructureAttr(_44a);},getColumnTogglingItems:function(){return dojo.map(this.layout.cells,function(cell){if(!cell.menuItems){cell.menuItems=[];}var self=this;var item=new dijit.CheckedMenuItem({label:cell.name,checked:!cell.hidden,_gridCell:cell,onChange:function(_44b){if(self.layout.setColumnVisibility(this._gridCell.index,_44b)){var _44c=this._gridCell.menuItems;if(_44c.length>1){dojo.forEach(_44c,function(item){if(item!==this){item.setAttribute("checked",_44b);}},this);}_44b=dojo.filter(self.layout.cells,function(c){if(c.menuItems.length>1){dojo.forEach(c.menuItems,"item.attr('disabled', false);");}else{c.menuItems[0].attr("disabled",false);}return !c.hidden;});if(_44b.length==1){dojo.forEach(_44b[0].menuItems,"item.attr('disabled', true);");}}},destroy:function(){var _44d=dojo.indexOf(this._gridCell.menuItems,this);this._gridCell.menuItems.splice(_44d,1);delete this._gridCell;dijit.CheckedMenuItem.prototype.destroy.apply(this,arguments);}});cell.menuItems.push(item);return item;},this);},_setHeaderMenuAttr:function(menu){if(this._placeholders&&this._placeholders.length){dojo.forEach(this._placeholders,function(p){p.unReplace(true);});this._placeholders=[];}if(this.headerMenu){this.headerMenu.unBindDomNode(this.viewsHeaderNode);}this.headerMenu=menu;if(!menu){return;}this.headerMenu.bindDomNode(this.viewsHeaderNode);if(this.headerMenu.getPlaceholders){this._placeholders=this.headerMenu.getPlaceholders(this.placeholderLabel);}},setHeaderMenu:function(menu){dojo.deprecated("dojox.grid._Grid.setHeaderMenu(obj)","use dojox.grid._Grid.attr('headerMenu', obj) instead.","2.0");this._setHeaderMenuAttr(menu);},setupHeaderMenu:function(){if(this._placeholders&&this._placeholders.length){dojo.forEach(this._placeholders,function(p){if(p._replaced){p.unReplace(true);}p.replace(this.getColumnTogglingItems());},this);}},_fetch:function(_44e){this.setScrollTop(0);},getItem:function(_44f){return null;},showMessage:function(_450){if(_450){this.messagesNode.innerHTML=_450;this.messagesNode.style.display="";}else{this.messagesNode.innerHTML="";this.messagesNode.style.display="none";}},_structureChanged:function(){this.buildViews();if(this.autoRender&&this._started){this.render();}},hasLayout:function(){return this.layout.cells.length;},resize:function(_451,_452){this._pendingChangeSize=_451;this._pendingResultSize=_452;this.sizeChange();},_getPadBorder:function(){this._padBorder=this._padBorder||dojo._getPadBorderExtents(this.domNode);return this._padBorder;},_getHeaderHeight:function(){var vns=this.viewsHeaderNode.style,t=vns.display=="none"?0:this.views.measureHeader();vns.height=t+"px";this.views.normalizeHeaderNodeHeight();return t;},_resize:function(_453,_454){_453=_453||this._pendingChangeSize;_454=_454||this._pendingResultSize;delete this._pendingChangeSize;delete this._pendingResultSize;if(!this.domNode){return;}var pn=this.domNode.parentNode;if(!pn||pn.nodeType!=1||!this.hasLayout()||pn.style.visibility=="hidden"||pn.style.display=="none"){return;}var _455=this._getPadBorder();var hh=undefined;var h;if(this._autoHeight){this.domNode.style.height="auto";this.viewsNode.style.height="";}else{if(typeof this.autoHeight=="number"){h=hh=this._getHeaderHeight();h+=(this.scroller.averageRowHeight*this.autoHeight);this.domNode.style.height=h+"px";}else{if(this.domNode.clientHeight<=_455.h){if(pn==document.body){this.domNode.style.height=this.defaultHeight;}else{if(this.height){this.domNode.style.height=this.height;}else{this.fitTo="parent";}}}}}if(_454){_453=_454;}if(_453){dojo.marginBox(this.domNode,_453);this.height=this.domNode.style.height;delete this.fitTo;}else{if(this.fitTo=="parent"){h=this._parentContentBoxHeight=this._parentContentBoxHeight||dojo._getContentBox(pn).h;this.domNode.style.height=Math.max(0,h)+"px";}}var _456=dojo.some(this.views.views,function(v){return v.flexCells;});if(!this._autoHeight&&(h||dojo._getContentBox(this.domNode).h)===0){this.viewsHeaderNode.style.display="none";}else{this.viewsHeaderNode.style.display="block";if(!_456&&hh===undefined){hh=this._getHeaderHeight();}}if(_456){hh=undefined;}this.adaptWidth();this.adaptHeight(hh);this.postresize();},adaptWidth:function(){var _457=(!this.initialWidth&&this.autoWidth);var w=_457?0:this.domNode.clientWidth||(this.domNode.offsetWidth-this._getPadBorder().w),vw=this.views.arrange(1,w);this.views.onEach("adaptWidth");if(_457){this.domNode.style.width=vw+"px";}},adaptHeight:function(_458){var t=_458===undefined?this._getHeaderHeight():_458;var h=(this._autoHeight?-1:Math.max(this.domNode.clientHeight-t,0)||0);this.views.onEach("setSize",[0,h]);this.views.onEach("adaptHeight");if(!this._autoHeight){var _459=0,_45a=0;var _45b=dojo.filter(this.views.views,function(v){var has=v.hasHScrollbar();if(has){_459++;}else{_45a++;}return (!has);});if(_459>0&&_45a>0){dojo.forEach(_45b,function(v){v.adaptHeight(true);});}}if(this.autoHeight===true||h!=-1||(typeof this.autoHeight=="number"&&this.autoHeight>=this.attr("rowCount"))){this.scroller.windowHeight=h;}else{this.scroller.windowHeight=Math.max(this.domNode.clientHeight-t,0);}},startup:function(){if(this._started){return;}this.inherited(arguments);if(this.autoRender){this.render();}},render:function(){if(!this.domNode){return;}if(!this._started){return;}if(!this.hasLayout()){this.scroller.init(0,this.keepRows,this.rowsPerPage);return;}this.update=this.defaultUpdate;this._render();},_render:function(){this.scroller.init(this.attr("rowCount"),this.keepRows,this.rowsPerPage);this.prerender();this.setScrollTop(0);this.postrender();},prerender:function(){this.keepRows=this._autoHeight?0:this.keepRows;this.scroller.setKeepInfo(this.keepRows);this.views.render();this._resize();},postrender:function(){this.postresize();this.focus.initFocusView();dojo.setSelectable(this.domNode,this.selectable);},postresize:function(){if(this._autoHeight){var size=Math.max(this.views.measureContent())+"px";this.viewsNode.style.height=size;}},renderRow:function(_45c,_45d){this.views.renderRow(_45c,_45d,this._skipRowRenormalize);},rowRemoved:function(_45e){this.views.rowRemoved(_45e);},invalidated:null,updating:false,beginUpdate:function(){this.invalidated=[];this.updating=true;},endUpdate:function(){this.updating=false;var i=this.invalidated,r;if(i.all){this.update();}else{if(i.rowCount!=undefined){this.updateRowCount(i.rowCount);}else{for(r in i){this.updateRow(Number(r));}}}this.invalidated=[];},defaultUpdate:function(){if(!this.domNode){return;}if(this.updating){this.invalidated.all=true;return;}this.lastScrollTop=this.scrollTop;this.prerender();this.scroller.invalidateNodes();this.setScrollTop(this.lastScrollTop);this.postrender();},update:function(){this.render();},updateRow:function(_45f){_45f=Number(_45f);if(this.updating){this.invalidated[_45f]=true;}else{this.views.updateRow(_45f);this.scroller.rowHeightChanged(_45f);}},updateRows:function(_460,_461){_460=Number(_460);_461=Number(_461);var i;if(this.updating){for(i=0;i<_461;i++){this.invalidated[i+_460]=true;}}else{for(i=0;i<_461;i++){this.views.updateRow(i+_460,this._skipRowRenormalize);}this.scroller.rowHeightChanged(_460);}},updateRowCount:function(_462){if(this.updating){this.invalidated.rowCount=_462;}else{this.rowCount=_462;this._setAutoHeightAttr(this.autoHeight,true);if(this.layout.cells.length){this.scroller.updateRowCount(_462);}this._resize();if(this.layout.cells.length){this.setScrollTop(this.scrollTop);}}},updateRowStyles:function(_463){this.views.updateRowStyles(_463);},getRowNode:function(_464){if(this.focus.focusView&&!(this.focus.focusView instanceof dojox.grid._RowSelector)){return this.focus.focusView.rowNodes[_464];}else{for(var i=0,_465;(_465=this.views.views[i]);i++){if(!(_465 instanceof dojox.grid._RowSelector)){return _465.rowNodes[_464];}}}return null;},rowHeightChanged:function(_466){this.views.renormalizeRow(_466);this.scroller.rowHeightChanged(_466);},fastScroll:true,delayScroll:false,scrollRedrawThreshold:(dojo.isIE?100:50),scrollTo:function(_467){if(!this.fastScroll){this.setScrollTop(_467);return;}var _468=Math.abs(this.lastScrollTop-_467);this.lastScrollTop=_467;if(_468>this.scrollRedrawThreshold||this.delayScroll){this.delayScroll=true;this.scrollTop=_467;this.views.setScrollTop(_467);if(this._pendingScroll){window.clearTimeout(this._pendingScroll);}var _469=this;this._pendingScroll=window.setTimeout(function(){delete _469._pendingScroll;_469.finishScrollJob();},200);}else{this.setScrollTop(_467);}},finishScrollJob:function(){this.delayScroll=false;this.setScrollTop(this.scrollTop);},setScrollTop:function(_46a){this.scroller.scroll(this.views.setScrollTop(_46a));},scrollToRow:function(_46b){this.setScrollTop(this.scroller.findScrollTop(_46b)+1);},styleRowNode:function(_46c,_46d){if(_46d){this.rows.styleRowNode(_46c,_46d);}},_mouseOut:function(e){this.rows.setOverRow(-2);},getCell:function(_46e){return this.layout.cells[_46e];},setCellWidth:function(_46f,_470){this.getCell(_46f).unitWidth=_470;},getCellName:function(_471){return "Cell "+_471.index;},canSort:function(_472){},sort:function(){},getSortAsc:function(_473){_473=_473==undefined?this.sortInfo:_473;return Boolean(_473>0);},getSortIndex:function(_474){_474=_474==undefined?this.sortInfo:_474;return Math.abs(_474)-1;},setSortIndex:function(_475,_476){var si=_475+1;if(_476!=undefined){si*=(_476?1:-1);}else{if(this.getSortIndex()==_475){si=-this.sortInfo;}}this.setSortInfo(si);},setSortInfo:function(_477){if(this.canSort(_477)){this.sortInfo=_477;this.sort();this.update();}},doKeyEvent:function(e){e.dispatch="do"+e.type;this.onKeyEvent(e);},_dispatch:function(m,e){if(m in this){return this[m](e);}return false;},dispatchKeyEvent:function(e){this._dispatch(e.dispatch,e);},dispatchContentEvent:function(e){this.edit.dispatchEvent(e)||e.sourceView.dispatchContentEvent(e)||this._dispatch(e.dispatch,e);},dispatchHeaderEvent:function(e){e.sourceView.dispatchHeaderEvent(e)||this._dispatch("doheader"+e.type,e);},dokeydown:function(e){this.onKeyDown(e);},doclick:function(e){if(e.cellNode){this.onCellClick(e);}else{this.onRowClick(e);}},dodblclick:function(e){if(e.cellNode){this.onCellDblClick(e);}else{this.onRowDblClick(e);}},docontextmenu:function(e){if(e.cellNode){this.onCellContextMenu(e);}else{this.onRowContextMenu(e);}},doheaderclick:function(e){if(e.cellNode){this.onHeaderCellClick(e);}else{this.onHeaderClick(e);}},doheaderdblclick:function(e){if(e.cellNode){this.onHeaderCellDblClick(e);}else{this.onHeaderDblClick(e);}},doheadercontextmenu:function(e){if(e.cellNode){this.onHeaderCellContextMenu(e);}else{this.onHeaderContextMenu(e);}},doStartEdit:function(_478,_479){this.onStartEdit(_478,_479);},doApplyCellEdit:function(_47a,_47b,_47c){this.onApplyCellEdit(_47a,_47b,_47c);},doCancelEdit:function(_47d){this.onCancelEdit(_47d);},doApplyEdit:function(_47e){this.onApplyEdit(_47e);},addRow:function(){this.updateRowCount(this.attr("rowCount")+1);},removeSelectedRows:function(){if(this.allItemsSelected){this.updateRowCount(0);}else{this.updateRowCount(Math.max(0,this.attr("rowCount")-this.selection.getSelected().length));}this.selection.clear();}});dojox.grid._Grid.markupFactory=function(_47f,node,ctor,_480){var d=dojo;var _481=function(n){var w=d.attr(n,"width")||"auto";if((w!="auto")&&(w.slice(-2)!="em")&&(w.slice(-1)!="%")){w=parseInt(w,10)+"px";}return w;};if(!_47f.structure&&node.nodeName.toLowerCase()=="table"){_47f.structure=d.query("> colgroup",node).map(function(cg){var sv=d.attr(cg,"span");var v={noscroll:(d.attr(cg,"noscroll")=="true")?true:false,__span:(!!sv?parseInt(sv,10):1),cells:[]};if(d.hasAttr(cg,"width")){v.width=_481(cg);}return v;});if(!_47f.structure.length){_47f.structure.push({__span:Infinity,cells:[]});}d.query("thead > tr",node).forEach(function(tr,_482){var _483=0;var _484=0;var _485;var _486=null;d.query("> th",tr).map(function(th){if(!_486){_485=0;_486=_47f.structure[0];}else{if(_483>=(_485+_486.__span)){_484++;_485+=_486.__span;var _487=_486;_486=_47f.structure[_484];}}var cell={name:d.trim(d.attr(th,"name")||th.innerHTML),colSpan:parseInt(d.attr(th,"colspan")||1,10),type:d.trim(d.attr(th,"cellType")||""),id:d.trim(d.attr(th,"id")||"")};_483+=cell.colSpan;var _488=d.attr(th,"rowspan");if(_488){cell.rowSpan=_488;}if(d.hasAttr(th,"width")){cell.width=_481(th);}if(d.hasAttr(th,"relWidth")){cell.relWidth=window.parseInt(dojo.attr(th,"relWidth"),10);}if(d.hasAttr(th,"hidden")){cell.hidden=d.attr(th,"hidden")=="true";}if(_480){_480(th,cell);}cell.type=cell.type?dojo.getObject(cell.type):dojox.grid.cells.Cell;if(cell.type&&cell.type.markupFactory){cell.type.markupFactory(th,cell);}if(!_486.cells[_482]){_486.cells[_482]=[];}_486.cells[_482].push(cell);});});}return new ctor(_47f,node);};})();}if(!dojo._hasResource["dojox.grid.DataSelection"]){dojo._hasResource["dojox.grid.DataSelection"]=true;dojo.provide("dojox.grid.DataSelection");dojo.declare("dojox.grid.DataSelection",dojox.grid.Selection,{getFirstSelected:function(){var idx=dojox.grid.Selection.prototype.getFirstSelected.call(this);if(idx==-1){return null;}return this.grid.getItem(idx);},getNextSelected:function(_489){var _48a=this.grid.getItemIndex(_489);var idx=dojox.grid.Selection.prototype.getNextSelected.call(this,_48a);if(idx==-1){return null;}return this.grid.getItem(idx);},getSelected:function(){var _48b=[];for(var i=0,l=this.selected.length;i<l;i++){if(this.selected[i]){_48b.push(this.grid.getItem(i));}}return _48b;},addToSelection:function(_48c){if(this.mode=="none"){return;}var idx=null;if(typeof _48c=="number"||typeof _48c=="string"){idx=_48c;}else{idx=this.grid.getItemIndex(_48c);}dojox.grid.Selection.prototype.addToSelection.call(this,idx);},deselect:function(_48d){if(this.mode=="none"){return;}var idx=null;if(typeof _48d=="number"||typeof _48d=="string"){idx=_48d;}else{idx=this.grid.getItemIndex(_48d);}dojox.grid.Selection.prototype.deselect.call(this,idx);},deselectAll:function(_48e){var idx=null;if(_48e||typeof _48e=="number"){if(typeof _48e=="number"||typeof _48e=="string"){idx=_48e;}else{idx=this.grid.getItemIndex(_48e);}dojox.grid.Selection.prototype.deselectAll.call(this,idx);}else{this.inherited(arguments);}}});}if(!dojo._hasResource["dojox.grid.DataGrid"]){dojo._hasResource["dojox.grid.DataGrid"]=true;dojo.provide("dojox.grid.DataGrid");dojo.declare("dojox.grid.DataGrid",dojox.grid._Grid,{store:null,query:null,queryOptions:null,fetchText:"...",sortFields:null,updateDelay:1,items:null,_store_connects:null,_by_idty:null,_by_idx:null,_cache:null,_pages:null,_pending_requests:null,_bop:-1,_eop:-1,_requests:0,rowCount:0,_isLoaded:false,_isLoading:false,postCreate:function(){this._pages=[];this._store_connects=[];this._by_idty={};this._by_idx=[];this._cache=[];this._pending_requests={};this._setStore(this.store);this.inherited(arguments);},createSelection:function(){this.selection=new dojox.grid.DataSelection(this);},get:function(_48f,_490){if(_490&&this.field=="_item"&&!this.fields){return _490;}else{if(_490&&this.fields){var ret=[];var s=this.grid.store;dojo.forEach(this.fields,function(f){ret=ret.concat(s.getValues(_490,f));});return ret;}}return (!_490?this.defaultValue:(!this.field?this.value:(this.field=="_item"?_490:this.grid.store.getValue(_490,this.field))));},_checkUpdateStatus:function(){if(this.updateDelay>0){var _491=false;if(this._endUpdateDelay){clearTimeout(this._endUpdateDelay);delete this._endUpdateDelay;_491=true;}if(!this.updating){this.beginUpdate();_491=true;}if(_491){var _492=this;this._endUpdateDelay=setTimeout(function(){delete _492._endUpdateDelay;_492.endUpdate();},this.updateDelay);}}},_onSet:function(item,_493,_494,_495){this._checkUpdateStatus();var idx=this.getItemIndex(item);if(idx>-1){this.updateRow(idx);}},_createItem:function(item,_496){var idty=this._hasIdentity?this.store.getIdentity(item):dojo.toJson(this.query)+":idx:"+_496+":sort:"+dojo.toJson(this.getSortProps());var o=this._by_idty[idty]={idty:idty,item:item};return o;},_addItem:function(item,_497,_498){this._by_idx[_497]=this._createItem(item,_497);if(!_498){this.updateRow(_497);}},_onNew:function(item,_499){this._checkUpdateStatus();var _49a=this.attr("rowCount");this._addingItem=true;this.updateRowCount(_49a+1);this._addingItem=false;this._addItem(item,_49a);this.showMessage();},_onDelete:function(item){this._checkUpdateStatus();var idx=this._getItemIndex(item,true);if(idx>=0){this._pages=[];this._bop=-1;this._eop=-1;var o=this._by_idx[idx];this._by_idx.splice(idx,1);delete this._by_idty[o.idty];this.updateRowCount(this.attr("rowCount")-1);if(this.attr("rowCount")===0){this.showMessage(this.noDataMessage);}}},_onRevert:function(){this._refresh();},setStore:function(_49b,_49c,_49d){this._setQuery(_49c,_49d);this._setStore(_49b);this._refresh(true);},setQuery:function(_49e,_49f){this._setQuery(_49e,_49f);this._refresh(true);},setItems:function(_4a0){this.items=_4a0;this._setStore(this.store);this._refresh(true);},_setQuery:function(_4a1,_4a2){this.query=_4a1;this.queryOptions=_4a2||this.queryOptions;},_setStore:function(_4a3){if(this.store&&this._store_connects){dojo.forEach(this._store_connects,function(arr){dojo.forEach(arr,dojo.disconnect);});}this.store=_4a3;if(this.store){var f=this.store.getFeatures();var h=[];this._canEdit=!!f["dojo.data.api.Write"]&&!!f["dojo.data.api.Identity"];this._hasIdentity=!!f["dojo.data.api.Identity"];if(!!f["dojo.data.api.Notification"]&&!this.items){h.push(this.connect(this.store,"onSet","_onSet"));h.push(this.connect(this.store,"onNew","_onNew"));h.push(this.connect(this.store,"onDelete","_onDelete"));}if(this._canEdit){h.push(this.connect(this.store,"revert","_onRevert"));}this._store_connects=h;}},_onFetchBegin:function(size,req){if(!this.scroller){return;}if(this.rowCount!=size){if(req.isRender){this.scroller.init(size,this.keepRows,this.rowsPerPage);this.rowCount=size;this._setAutoHeightAttr(this.autoHeight,true);this._skipRowRenormalize=true;this.prerender();this._skipRowRenormalize=false;}else{this.updateRowCount(size);}}if(!size){this.views.render();this._resize();this.showMessage(this.noDataMessage);this.focus.initFocusView();}else{this.showMessage();}},_onFetchComplete:function(_4a4,req){if(!this.scroller){return;}if(_4a4&&_4a4.length>0){dojo.forEach(_4a4,function(item,idx){this._addItem(item,req.start+idx,true);},this);if(this._autoHeight){this._skipRowRenormalize=true;}this.updateRows(req.start,_4a4.length);if(this._autoHeight){this._skipRowRenormalize=false;}if(req.isRender){this.setScrollTop(0);this.postrender();}else{if(this._lastScrollTop){this.setScrollTop(this._lastScrollTop);}}}delete this._lastScrollTop;if(!this._isLoaded){this._isLoading=false;this._isLoaded=true;}this._pending_requests[req.start]=false;},_onFetchError:function(err,req){delete this._lastScrollTop;if(!this._isLoaded){this._isLoading=false;this._isLoaded=true;this.showMessage(this.errorMessage);}this._pending_requests[req.start]=false;this.onFetchError(err,req);},onFetchError:function(err,req){},_fetch:function(_4a5,_4a6){_4a5=_4a5||0;if(this.store&&!this._pending_requests[_4a5]){if(!this._isLoaded&&!this._isLoading){this._isLoading=true;this.showMessage(this.loadingMessage);}this._pending_requests[_4a5]=true;try{if(this.items){var _4a7=this.items;var _4a8=this.store;this.rowsPerPage=_4a7.length;var req={start:_4a5,count:this.rowsPerPage,isRender:_4a6};this._onFetchBegin(_4a7.length,req);var _4a9=0;dojo.forEach(_4a7,function(i){if(!_4a8.isItemLoaded(i)){_4a9++;}});if(_4a9===0){this._onFetchComplete(_4a7,req);}else{var _4aa=function(item){_4a9--;if(_4a9===0){this._onFetchComplete(_4a7,req);}};dojo.forEach(_4a7,function(i){if(!_4a8.isItemLoaded(i)){_4a8.loadItem({item:i,onItem:_4aa,scope:this});}},this);}}else{this.store.fetch({start:_4a5,count:this.rowsPerPage,query:this.query,sort:this.getSortProps(),queryOptions:this.queryOptions,isRender:_4a6,onBegin:dojo.hitch(this,"_onFetchBegin"),onComplete:dojo.hitch(this,"_onFetchComplete"),onError:dojo.hitch(this,"_onFetchError")});}}catch(e){this._onFetchError(e,{start:_4a5,count:this.rowsPerPage});}}},_clearData:function(){this.updateRowCount(0);this._by_idty={};this._by_idx=[];this._pages=[];this._bop=this._eop=-1;this._isLoaded=false;this._isLoading=false;},getItem:function(idx){var data=this._by_idx[idx];if(!data||(data&&!data.item)){this._preparePage(idx);return null;}return data.item;},getItemIndex:function(item){return this._getItemIndex(item,false);},_getItemIndex:function(item,_4ab){if(!_4ab&&!this.store.isItem(item)){return -1;}var idty=this._hasIdentity?this.store.getIdentity(item):null;for(var i=0,l=this._by_idx.length;i<l;i++){var d=this._by_idx[i];if(d&&((idty&&d.idty==idty)||(d.item===item))){return i;}}return -1;},filter:function(_4ac,_4ad){this.query=_4ac;if(_4ad){this._clearData();}this._fetch();},_getItemAttr:function(idx,attr){var item=this.getItem(idx);return (!item?this.fetchText:this.store.getValue(item,attr));},_render:function(){if(this.domNode.parentNode){this.scroller.init(this.attr("rowCount"),this.keepRows,this.rowsPerPage);this.prerender();this._fetch(0,true);}},_requestsPending:function(_4ae){return this._pending_requests[_4ae];},_rowToPage:function(_4af){return (this.rowsPerPage?Math.floor(_4af/this.rowsPerPage):_4af);},_pageToRow:function(_4b0){return (this.rowsPerPage?this.rowsPerPage*_4b0:_4b0);},_preparePage:function(_4b1){if((_4b1<this._bop||_4b1>=this._eop)&&!this._addingItem){var _4b2=this._rowToPage(_4b1);this._needPage(_4b2);this._bop=_4b2*this.rowsPerPage;this._eop=this._bop+(this.rowsPerPage||this.attr("rowCount"));}},_needPage:function(_4b3){if(!this._pages[_4b3]){this._pages[_4b3]=true;this._requestPage(_4b3);}},_requestPage:function(_4b4){var row=this._pageToRow(_4b4);var _4b5=Math.min(this.rowsPerPage,this.attr("rowCount")-row);if(_4b5>0){this._requests++;if(!this._requestsPending(row)){setTimeout(dojo.hitch(this,"_fetch",row,false),1);}}},getCellName:function(_4b6){return _4b6.field;},_refresh:function(_4b7){this._clearData();this._fetch(0,_4b7);},sort:function(){this._lastScrollTop=this.scrollTop;this._refresh();},canSort:function(){return (!this._isLoading);},getSortProps:function(){var c=this.getCell(this.getSortIndex());if(!c){if(this.sortFields){return this.sortFields;}return null;}else{var desc=c["sortDesc"];var si=!(this.sortInfo>0);if(typeof desc=="undefined"){desc=si;}else{desc=si?!desc:desc;}return [{attribute:c.field,descending:desc}];}},styleRowState:function(_4b8){if(this.store&&this.store.getState){var _4b9=this.store.getState(_4b8.index),c="";for(var i=0,ss=["inflight","error","inserting"],s;s=ss[i];i++){if(_4b9[s]){c=" dojoxGridRow-"+s;break;}}_4b8.customClasses+=c;}},onStyleRow:function(_4ba){this.styleRowState(_4ba);this.inherited(arguments);},canEdit:function(_4bb,_4bc){return this._canEdit;},_copyAttr:function(idx,attr){var row={};var _4bd={};var src=this.getItem(idx);return this.store.getValue(src,attr);},doStartEdit:function(_4be,_4bf){if(!this._cache[_4bf]){this._cache[_4bf]=this._copyAttr(_4bf,_4be.field);}this.onStartEdit(_4be,_4bf);},doApplyCellEdit:function(_4c0,_4c1,_4c2){this.store.fetchItemByIdentity({identity:this._by_idx[_4c1].idty,onItem:dojo.hitch(this,function(item){var _4c3=this.store.getValue(item,_4c2);if(typeof _4c3=="number"){_4c0=isNaN(_4c0)?_4c0:parseFloat(_4c0);}else{if(typeof _4c3=="boolean"){_4c0=_4c0=="true"?true:_4c0=="false"?false:_4c0;}else{if(_4c3 instanceof Date){var _4c4=new Date(_4c0);_4c0=isNaN(_4c4.getTime())?_4c0:_4c4;}}}this.store.setValue(item,_4c2,_4c0);this.onApplyCellEdit(_4c0,_4c1,_4c2);})});},doCancelEdit:function(_4c5){var _4c6=this._cache[_4c5];if(_4c6){this.updateRow(_4c5);delete this._cache[_4c5];}this.onCancelEdit.apply(this,arguments);},doApplyEdit:function(_4c7,_4c8){var _4c9=this._cache[_4c7];this.onApplyEdit(_4c7);},removeSelectedRows:function(){if(this._canEdit){this.edit.apply();var fx=dojo.hitch(this,function(_4ca){if(_4ca.length){dojo.forEach(_4ca,this.store.deleteItem,this.store);this.selection.clear();}});if(this.allItemsSelected){this.store.fetch({query:this.query,queryOptions:this.queryOptions,onComplete:fx});}else{fx(this.selection.getSelected());}}}});dojox.grid.DataGrid.cell_markupFactory=function(_4cb,node,_4cc){var _4cd=dojo.trim(dojo.attr(node,"field")||"");if(_4cd){_4cc.field=_4cd;}_4cc.field=_4cc.field||_4cc.name;var _4ce=dojo.trim(dojo.attr(node,"fields")||"");if(_4ce){_4cc.fields=_4ce.split(",");}if(_4cb){_4cb(node,_4cc);}};dojox.grid.DataGrid.markupFactory=function(_4cf,node,ctor,_4d0){return dojox.grid._Grid.markupFactory(_4cf,node,ctor,dojo.partial(dojox.grid.DataGrid.cell_markupFactory,_4d0));};}dojo.i18n._preloadLocalizations("dojox.grid.nls.DataGrid",["ROOT","ar","ca","cs","da","de","de-de","el","en","en-gb","en-us","es","es-es","fi","fi-fi","fr","fr-fr","he","he-il","hu","it","it-it","ja","ja-jp","ko","ko-kr","nb","nl","nl-nl","pl","pt","pt-br","pt-pt","ru","sk","sl","sv","th","tr","xx","zh","zh-cn","zh-tw"]);
