/*
	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["dojo.colors"]){dojo._hasResource["dojo.colors"]=true;dojo.provide("dojo.colors");(function(){var _1=function(m1,m2,h){if(h<0){++h;}if(h>1){--h;}var h6=6*h;if(h6<1){return m1+(m2-m1)*h6;}if(2*h<1){return m2;}if(3*h<2){return m1+(m2-m1)*(2/3-h)*6;}return m1;};dojo.colorFromRgb=function(_2,_3){var m=_2.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);if(m){var c=m[2].split(/\s*,\s*/),l=c.length,t=m[1],a;if((t=="rgb"&&l==3)||(t=="rgba"&&l==4)){var r=c[0];if(r.charAt(r.length-1)=="%"){a=dojo.map(c,function(x){return parseFloat(x)*2.56;});if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,_3);}return dojo.colorFromArray(c,_3);}if((t=="hsl"&&l==3)||(t=="hsla"&&l==4)){var H=((parseFloat(c[0])%360)+360)%360/360,S=parseFloat(c[1])/100,L=parseFloat(c[2])/100,m2=L<=0.5?L*(S+1):L+S-L*S,m1=2*L-m2;a=[_1(m1,m2,H+1/3)*256,_1(m1,m2,H)*256,_1(m1,m2,H-1/3)*256,1];if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,_3);}}return null;};var _4=function(c,_5,_6){c=Number(c);return isNaN(c)?_6:c<_5?_5:c>_6?_6:c;};dojo.Color.prototype.sanitize=function(){var t=this;t.r=Math.round(_4(t.r,0,255));t.g=Math.round(_4(t.g,0,255));t.b=Math.round(_4(t.b,0,255));t.a=_4(t.a,0,1);return this;};})();dojo.colors.makeGrey=function(g,a){return dojo.colorFromArray([g,g,g,a]);};dojo.mixin(dojo.Color.named,{aliceblue:[240,248,255],antiquewhite:[250,235,215],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],blanchedalmond:[255,235,205],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],oldlace:[253,245,230],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],thistle:[216,191,216],tomato:[255,99,71],transparent:[0,0,0,0],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],whitesmoke:[245,245,245],yellowgreen:[154,205,50]});}if(!dojo._hasResource["dojo.i18n"]){dojo._hasResource["dojo.i18n"]=true;dojo.provide("dojo.i18n");dojo.i18n.getLocalization=function(_7,_8,_9){_9=dojo.i18n.normalizeLocale(_9);var _a=_9.split("-");var _b=[_7,"nls",_8].join(".");var _c=dojo._loadedModules[_b];if(_c){var _d;for(var i=_a.length;i>0;i--){var _e=_a.slice(0,i).join("_");if(_c[_e]){_d=_c[_e];break;}}if(!_d){_d=_c.ROOT;}if(_d){var _f=function(){};_f.prototype=_d;return new _f();}}throw new Error("Bundle not found: "+_8+" in "+_7+" , locale="+_9);};dojo.i18n.normalizeLocale=function(_10){var _11=_10?_10.toLowerCase():dojo.locale;if(_11=="root"){_11="ROOT";}return _11;};dojo.i18n._requireLocalization=function(_12,_13,_14,_15){var _16=dojo.i18n.normalizeLocale(_14);var _17=[_12,"nls",_13].join(".");var _18="";if(_15){var _19=_15.split(",");for(var i=0;i<_19.length;i++){if(_16["indexOf"](_19[i])==0){if(_19[i].length>_18.length){_18=_19[i];}}}if(!_18){_18="ROOT";}}var _1a=_15?_18:_16;var _1b=dojo._loadedModules[_17];var _1c=null;if(_1b){if(dojo.config.localizationComplete&&_1b._built){return;}var _1d=_1a.replace(/-/g,"_");var _1e=_17+"."+_1d;_1c=dojo._loadedModules[_1e];}if(!_1c){_1b=dojo["provide"](_17);var _1f=dojo._getModuleSymbols(_12);var _20=_1f.concat("nls").join("/");var _21;dojo.i18n._searchLocalePath(_1a,_15,function(loc){var _22=loc.replace(/-/g,"_");var _23=_17+"."+_22;var _24=false;if(!dojo._loadedModules[_23]){dojo["provide"](_23);var _25=[_20];if(loc!="ROOT"){_25.push(loc);}_25.push(_13);var _26=_25.join("/")+".js";_24=dojo._loadPath(_26,null,function(_27){var _28=function(){};_28.prototype=_21;_1b[_22]=new _28();for(var j in _27){_1b[_22][j]=_27[j];}});}else{_24=true;}if(_24&&_1b[_22]){_21=_1b[_22];}else{_1b[_22]=_21;}if(_15){return true;}});}if(_15&&_16!=_18){_1b[_16.replace(/-/g,"_")]=_1b[_18.replace(/-/g,"_")];}};(function(){var _29=dojo.config.extraLocale;if(_29){if(!_29 instanceof Array){_29=[_29];}var req=dojo.i18n._requireLocalization;dojo.i18n._requireLocalization=function(m,b,_2a,_2b){req(m,b,_2a,_2b);if(_2a){return;}for(var i=0;i<_29.length;i++){req(m,b,_29[i],_2b);}};}})();dojo.i18n._searchLocalePath=function(_2c,_2d,_2e){_2c=dojo.i18n.normalizeLocale(_2c);var _2f=_2c.split("-");var _30=[];for(var i=_2f.length;i>0;i--){_30.push(_2f.slice(0,i).join("-"));}_30.push(false);if(_2d){_30.reverse();}for(var j=_30.length-1;j>=0;j--){var loc=_30[j]||"ROOT";var _31=_2e(loc);if(_31){break;}}};dojo.i18n._preloadLocalizations=function(_32,_33){function _34(_35){_35=dojo.i18n.normalizeLocale(_35);dojo.i18n._searchLocalePath(_35,true,function(loc){for(var i=0;i<_33.length;i++){if(_33[i]==loc){dojo["require"](_32+"_"+loc);return true;}}return false;});};_34();var _36=dojo.config.extraLocale||[];for(var i=0;i<_36.length;i++){_34(_36[i]);}};}if(!dojo._hasResource["dijit.ColorPalette"]){dojo._hasResource["dijit.ColorPalette"]=true;dojo.provide("dijit.ColorPalette");dojo.declare("dijit.ColorPalette",[dijit._Widget,dijit._Templated],{defaultTimeout:500,timeoutChangeRate:0.9,palette:"7x10",value:null,_currentFocus:0,_xDim:null,_yDim:null,_palettes:{"7x10":[["white","seashell","cornsilk","lemonchiffon","lightyellow","palegreen","paleturquoise","lightcyan","lavender","plum"],["lightgray","pink","bisque","moccasin","khaki","lightgreen","lightseagreen","lightskyblue","cornflowerblue","violet"],["silver","lightcoral","sandybrown","orange","palegoldenrod","chartreuse","mediumturquoise","skyblue","mediumslateblue","orchid"],["gray","red","orangered","darkorange","yellow","limegreen","darkseagreen","royalblue","slateblue","mediumorchid"],["dimgray","crimson","chocolate","coral","gold","forestgreen","seagreen","blue","blueviolet","darkorchid"],["darkslategray","firebrick","saddlebrown","sienna","olive","green","darkcyan","mediumblue","darkslateblue","darkmagenta"],["black","darkred","maroon","brown","darkolivegreen","darkgreen","midnightblue","navy","indigo","purple"]],"3x4":[["white","lime","green","blue"],["silver","yellow","fuchsia","navy"],["gray","red","purple","black"]]},_imagePaths:{"7x10":dojo.moduleUrl("dijit.themes","a11y/colors7x10.png"),"3x4":dojo.moduleUrl("dijit.themes","a11y/colors3x4.png")},_paletteCoords:{"leftOffset":3,"topOffset":3,"cWidth":20,"cHeight":20},templateString:dojo.cache("dijit","templates/ColorPalette.html","<div class=\"dijitInline dijitColorPalette\">\n\t<div class=\"dijitColorPaletteInner\" dojoAttachPoint=\"divNode\" waiRole=\"grid\"\">\n\t\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\" alt=\"\">\n\t</div>\n</div>\n"),_paletteDims:{"7x10":{"width":"206px","height":"145px"},"3x4":{"width":"86px","height":"64px"}},tabIndex:"0",buildRendering:function(){this.inherited(arguments);dojo.mixin(this.divNode.style,this._paletteDims[this.palette]);this.imageNode.setAttribute("src",this._imagePaths[this.palette].toString());var _37=this._palettes[this.palette];this.domNode.style.position="relative";this._cellNodes=[];this.colorNames=dojo.i18n.getLocalization("dojo","colors",this.lang);var url=this._blankGif,_38=new dojo.Color(),_39=this._paletteCoords;for(var row=0;row<_37.length;row++){var _3a=dojo.create("div",{role:"row"},this.divNode);for(var col=0;col<_37[row].length;col++){var _3b=_37[row][col],_3c=_38.setColor(dojo.Color.named[_3b]);var _3d=dojo.create("span",{"class":"dijitPaletteCell",tabIndex:"-1",title:this.colorNames[_3b],style:{top:_39.topOffset+(row*_39.cHeight)+"px",left:_39.leftOffset+(col*_39.cWidth)+"px"}});var _3e=dojo.create("img",{src:url,"class":"dijitPaletteImg",alt:this.colorNames[_3b]},_3d);_3e.color=_3c.toHex();var _3f=_3e.style;_3f.color=_3f.backgroundColor=_3e.color;dojo.forEach(["Dijitclick","MouseEnter","MouseLeave","Focus"],function(_40){this.connect(_3d,"on"+_40.toLowerCase(),"_onCell"+_40);},this);dojo.place(_3d,_3a);dijit.setWaiRole(_3d,"gridcell");_3d.index=this._cellNodes.length;this._cellNodes.push(_3d);}}this._xDim=_37[0].length;this._yDim=_37.length;var _41={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:1,LEFT_ARROW:-1};for(var key in _41){this._connects.push(dijit.typematic.addKeyListener(this.domNode,{charOrCode:dojo.keys[key],ctrlKey:false,altKey:false,shiftKey:false},this,function(){var _42=_41[key];return function(_43){this._navigateByKey(_42,_43);};}(),this.timeoutChangeRate,this.defaultTimeout));}},postCreate:function(){this.inherited(arguments);this._currentFocus=this._cellNodes[0];dojo.attr(this._currentFocus,"tabIndex",this.tabIndex);},focus:function(){dojo.addClass(this._currentFocus,"dijitPaletteCellHighlight");dijit.focus(this._currentFocus);},onChange:function(_44){},_onFocus:function(){dojo.addClass(this._currentFocus,"dijitPaletteCellHighlight");this.inherited(arguments);},_onBlur:function(){dojo.attr(this._currentFocus,"tabIndex","-1");dojo.removeClass(this._currentFocus,"dijitPaletteCellHighlight");this._currentFocus=this._cellNodes[0];dojo.attr(this._currentFocus,"tabIndex",this.tabIndex);this.inherited(arguments);},_onCellDijitclick:function(evt){var _45=evt.currentTarget;this._selectColor(_45);dojo.stopEvent(evt);},_onCellMouseEnter:function(evt){var _46=evt.currentTarget;this._setCurrent(_46);},_onCellMouseLeave:function(evt){dojo.removeClass(this._currentFocus,"dijitPaletteCellHighlight");},_onCellFocus:function(evt){this._setCurrent(evt.currentTarget);},_setCurrent:function(_47){if("_currentFocus" in this){dojo.attr(this._currentFocus,"tabIndex","-1");dojo.removeClass(this._currentFocus,"dijitPaletteCellHighlight");}this._currentFocus=_47;if(_47){dojo.attr(_47,"tabIndex",this.tabIndex);dojo.addClass(_47,"dijitPaletteCellHighlight");}},_selectColor:function(_48){var img=_48.getElementsByTagName("img")[0];this.onChange(this.value=img.color);},_navigateByKey:function(_49,_4a){if(_4a==-1){return;}var _4b=this._currentFocus.index+_49;if(_4b<this._cellNodes.length&&_4b>-1){var _4c=this._cellNodes[_4b];this._setCurrent(_4c);setTimeout(dojo.hitch(dijit,"focus",_4c),0);}}});}if(!dojo._hasResource["dijit.Declaration"]){dojo._hasResource["dijit.Declaration"]=true;dojo.provide("dijit.Declaration");dojo.declare("dijit.Declaration",dijit._Widget,{_noScript:true,widgetClass:"",defaults:null,mixins:[],buildRendering:function(){var src=this.srcNodeRef.parentNode.removeChild(this.srcNodeRef),_4d=dojo.query("> script[type^='dojo/method'][event]",src).orphan(),_4e=dojo.query("> script[type^='dojo/method']",src).orphan(),_4f=dojo.query("> script[type^='dojo/connect']",src).orphan(),_50=src.nodeName;var _51=this.defaults||{};dojo.forEach(_4d,function(s){var evt=s.getAttribute("event"),_52=dojo.parser._functionFromScript(s);_51[evt]=_52;});this.mixins=this.mixins.length?dojo.map(this.mixins,function(_53){return dojo.getObject(_53);}):[dijit._Widget,dijit._Templated];_51.widgetsInTemplate=true;_51._skipNodeCache=true;_51.templateString="<"+_50+" class='"+src.className+"' dojoAttachPoint='"+(src.getAttribute("dojoAttachPoint")||"")+"' dojoAttachEvent='"+(src.getAttribute("dojoAttachEvent")||"")+"' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+_50+">";dojo.query("[dojoType]",src).forEach(function(_54){_54.removeAttribute("dojoType");});var wc=dojo.declare(this.widgetClass,this.mixins,_51);var _55=_4f.concat(_4e);dojo.forEach(_55,function(s){var evt=s.getAttribute("event")||"postscript",_56=dojo.parser._functionFromScript(s);dojo.connect(wc.prototype,evt,_56);});}});}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 _57=n.scrollLeft,_58=n.scrollTop;n.scrollLeft=n.scrollLeft+dx;n.scrollTop=n.scrollTop+dy;if(_57!=n.scrollLeft||_58!=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(_59,e,_5a){this.node=dojo.byId(_59);this.marginBox={l:e.pageX,t:e.pageY};this.mouseButton=e.button;var h=this.host=_5a,d=_59.ownerDocument,_5b=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),_5b];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(_5c,_5d){this.node=dojo.byId(_5c);if(!_5d){_5d={};}this.handle=_5d.handle?dojo.byId(_5d.handle):null;if(!this.handle){this.handle=this.node;}this.delay=_5d.delay>0?_5d.delay:0;this.skip=_5d.skip;this.mover=_5d.mover?_5d.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(_5e,_5f){return new dojo.dnd.Moveable(_5f,_5e);},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(_60){dojo.publish("/dnd/move/start",[_60]);dojo.addClass(dojo.body(),"dojoMove");dojo.addClass(this.node,"dojoMoveItem");},onMoveStop:function(_61){dojo.publish("/dnd/move/stop",[_61]);dojo.removeClass(dojo.body(),"dojoMove");dojo.removeClass(this.node,"dojoMoveItem");},onFirstMove:function(_62){},onMove:function(_63,_64){this.onMoving(_63,_64);var s=_63.node.style;s.left=_64.l+"px";s.top=_64.t+"px";this.onMoved(_63,_64);},onMoving:function(_65,_66){},onMoved:function(_67,_68){}});}if(!dojo._hasResource["dojo.dnd.move"]){dojo._hasResource["dojo.dnd.move"]=true;dojo.provide("dojo.dnd.move");dojo.declare("dojo.dnd.move.constrainedMoveable",dojo.dnd.Moveable,{constraints:function(){},within:false,markupFactory:function(_69,_6a){return new dojo.dnd.move.constrainedMoveable(_6a,_69);},constructor:function(_6b,_6c){if(!_6c){_6c={};}this.constraints=_6c.constraints;this.within=_6c.within;},onFirstMove:function(_6d){var c=this.constraintBox=this.constraints.call(this,_6d);c.r=c.l+c.w;c.b=c.t+c.h;if(this.within){var mb=dojo.marginBox(_6d.node);c.r-=mb.w;c.b-=mb.h;}},onMove:function(_6e,_6f){var c=this.constraintBox,s=_6e.node.style;s.left=(_6f.l<c.l?c.l:c.r<_6f.l?c.r:_6f.l)+"px";s.top=(_6f.t<c.t?c.t:c.b<_6f.t?c.b:_6f.t)+"px";}});dojo.declare("dojo.dnd.move.boxConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{box:{},markupFactory:function(_70,_71){return new dojo.dnd.move.boxConstrainedMoveable(_71,_70);},constructor:function(_72,_73){var box=_73&&_73.box;this.constraints=function(){return box;};}});dojo.declare("dojo.dnd.move.parentConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{area:"content",markupFactory:function(_74,_75){return new dojo.dnd.move.parentConstrainedMoveable(_75,_74);},constructor:function(_76,_77){var _78=_77&&_77.area;this.constraints=function(){var n=this.node.parentNode,s=dojo.getComputedStyle(n),mb=dojo._getMarginBox(n,s);if(_78=="margin"){return mb;}var t=dojo._getMarginExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(_78=="border"){return mb;}t=dojo._getBorderExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(_78=="padding"){return mb;}t=dojo._getPadExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;return mb;};}});dojo.dnd.move.constrainedMover=function(fun,_79){dojo.deprecated("dojo.dnd.move.constrainedMover, use dojo.dnd.move.constrainedMoveable instead");var _7a=function(_7b,e,_7c){dojo.dnd.Mover.call(this,_7b,e,_7c);};dojo.extend(_7a,dojo.dnd.Mover.prototype);dojo.extend(_7a,{onMouseMove:function(e){dojo.dnd.autoScroll(e);var m=this.marginBox,c=this.constraintBox,l=m.l+e.pageX,t=m.t+e.pageY;l=l<c.l?c.l:c.r<l?c.r:l;t=t<c.t?c.t:c.b<t?c.b:t;this.host.onMove(this,{l:l,t:t});},onFirstMove:function(){dojo.dnd.Mover.prototype.onFirstMove.call(this);var c=this.constraintBox=fun.call(this);c.r=c.l+c.w;c.b=c.t+c.h;if(_79){var mb=dojo.marginBox(this.node);c.r-=mb.w;c.b-=mb.h;}}});return _7a;};dojo.dnd.move.boxConstrainedMover=function(box,_7d){dojo.deprecated("dojo.dnd.move.boxConstrainedMover, use dojo.dnd.move.boxConstrainedMoveable instead");return dojo.dnd.move.constrainedMover(function(){return box;},_7d);};dojo.dnd.move.parentConstrainedMover=function(_7e,_7f){dojo.deprecated("dojo.dnd.move.parentConstrainedMover, use dojo.dnd.move.parentConstrainedMoveable instead");var fun=function(){var n=this.node.parentNode,s=dojo.getComputedStyle(n),mb=dojo._getMarginBox(n,s);if(_7e=="margin"){return mb;}var t=dojo._getMarginExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(_7e=="border"){return mb;}t=dojo._getBorderExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(_7e=="padding"){return mb;}t=dojo._getPadExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;return mb;};return dojo.dnd.move.constrainedMover(fun,_7f);};dojo.dnd.constrainedMover=dojo.dnd.move.constrainedMover;dojo.dnd.boxConstrainedMover=dojo.dnd.move.boxConstrainedMover;dojo.dnd.parentConstrainedMover=dojo.dnd.move.parentConstrainedMover;}if(!dojo._hasResource["dojo.dnd.TimedMoveable"]){dojo._hasResource["dojo.dnd.TimedMoveable"]=true;dojo.provide("dojo.dnd.TimedMoveable");(function(){var _80=dojo.dnd.Moveable.prototype.onMove;dojo.declare("dojo.dnd.TimedMoveable",dojo.dnd.Moveable,{timeout:40,constructor:function(_81,_82){if(!_82){_82={};}if(_82.timeout&&typeof _82.timeout=="number"&&_82.timeout>=0){this.timeout=_82.timeout;}},markupFactory:function(_83,_84){return new dojo.dnd.TimedMoveable(_84,_83);},onMoveStop:function(_85){if(_85._timer){clearTimeout(_85._timer);_80.call(this,_85,_85._leftTop);}dojo.dnd.Moveable.prototype.onMoveStop.apply(this,arguments);},onMove:function(_86,_87){_86._leftTop=_87;if(!_86._timer){var _88=this;_86._timer=setTimeout(function(){_86._timer=null;_80.call(_88,_86,_86._leftTop);},this.timeout);}}});})();}if(!dojo._hasResource["dojo.fx.Toggler"]){dojo._hasResource["dojo.fx.Toggler"]=true;dojo.provide("dojo.fx.Toggler");dojo.declare("dojo.fx.Toggler",null,{node:null,showFunc:dojo.fadeIn,hideFunc:dojo.fadeOut,showDuration:200,hideDuration:200,constructor:function(_89){var _8a=this;dojo.mixin(_8a,_89);_8a.node=_89.node;_8a._showArgs=dojo.mixin({},_89);_8a._showArgs.node=_8a.node;_8a._showArgs.duration=_8a.showDuration;_8a.showAnim=_8a.showFunc(_8a._showArgs);_8a._hideArgs=dojo.mixin({},_89);_8a._hideArgs.node=_8a.node;_8a._hideArgs.duration=_8a.hideDuration;_8a.hideAnim=_8a.hideFunc(_8a._hideArgs);dojo.connect(_8a.showAnim,"beforeBegin",dojo.hitch(_8a.hideAnim,"stop",true));dojo.connect(_8a.hideAnim,"beforeBegin",dojo.hitch(_8a.showAnim,"stop",true));},show:function(_8b){return this.showAnim.play(_8b||0);},hide:function(_8c){return this.hideAnim.play(_8c||0);}});}if(!dojo._hasResource["dojo.fx"]){dojo._hasResource["dojo.fx"]=true;dojo.provide("dojo.fx");(function(){var d=dojo,_8d={_fire:function(evt,_8e){if(this[evt]){this[evt].apply(this,_8e||[]);}return this;}};var _8f=function(_90){this._index=-1;this._animations=_90||[];this._current=this._onAnimateCtx=this._onEndCtx=null;this.duration=0;d.forEach(this._animations,function(a){this.duration+=a.duration;if(a.delay){this.duration+=a.delay;}},this);};d.extend(_8f,{_onAnimate:function(){this._fire("onAnimate",arguments);},_onEnd:function(){d.disconnect(this._onAnimateCtx);d.disconnect(this._onEndCtx);this._onAnimateCtx=this._onEndCtx=null;if(this._index+1==this._animations.length){this._fire("onEnd");}else{this._current=this._animations[++this._index];this._onAnimateCtx=d.connect(this._current,"onAnimate",this,"_onAnimate");this._onEndCtx=d.connect(this._current,"onEnd",this,"_onEnd");this._current.play(0,true);}},play:function(_91,_92){if(!this._current){this._current=this._animations[this._index=0];}if(!_92&&this._current.status()=="playing"){return this;}var _93=d.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_94=d.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_95=d.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);d.disconnect(_93);d.disconnect(_94);d.disconnect(_95);});if(this._onAnimateCtx){d.disconnect(this._onAnimateCtx);}this._onAnimateCtx=d.connect(this._current,"onAnimate",this,"_onAnimate");if(this._onEndCtx){d.disconnect(this._onEndCtx);}this._onEndCtx=d.connect(this._current,"onEnd",this,"_onEnd");this._current.play.apply(this._current,arguments);return this;},pause:function(){if(this._current){var e=d.connect(this._current,"onPause",this,function(arg){this._fire("onPause",arguments);d.disconnect(e);});this._current.pause();}return this;},gotoPercent:function(_96,_97){this.pause();var _98=this.duration*_96;this._current=null;d.some(this._animations,function(a){if(a.duration<=_98){this._current=a;return true;}_98-=a.duration;return false;});if(this._current){this._current.gotoPercent(_98/this._current.duration,_97);}return this;},stop:function(_99){if(this._current){if(_99){for(;this._index+1<this._animations.length;++this._index){this._animations[this._index].stop(true);}this._current=this._animations[this._index];}var e=d.connect(this._current,"onStop",this,function(arg){this._fire("onStop",arguments);d.disconnect(e);});this._current.stop();}return this;},status:function(){return this._current?this._current.status():"stopped";},destroy:function(){if(this._onAnimateCtx){d.disconnect(this._onAnimateCtx);}if(this._onEndCtx){d.disconnect(this._onEndCtx);}}});d.extend(_8f,_8d);dojo.fx.chain=function(_9a){return new _8f(_9a);};var _9b=function(_9c){this._animations=_9c||[];this._connects=[];this._finished=0;this.duration=0;d.forEach(_9c,function(a){var _9d=a.duration;if(a.delay){_9d+=a.delay;}if(this.duration<_9d){this.duration=_9d;}this._connects.push(d.connect(a,"onEnd",this,"_onEnd"));},this);this._pseudoAnimation=new d.Animation({curve:[0,1],duration:this.duration});var _9e=this;d.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop","onEnd"],function(evt){_9e._connects.push(d.connect(_9e._pseudoAnimation,evt,function(){_9e._fire(evt,arguments);}));});};d.extend(_9b,{_doAction:function(_9f,_a0){d.forEach(this._animations,function(a){a[_9f].apply(a,_a0);});return this;},_onEnd:function(){if(++this._finished>this._animations.length){this._fire("onEnd");}},_call:function(_a1,_a2){var t=this._pseudoAnimation;t[_a1].apply(t,_a2);},play:function(_a3,_a4){this._finished=0;this._doAction("play",arguments);this._call("play",arguments);return this;},pause:function(){this._doAction("pause",arguments);this._call("pause",arguments);return this;},gotoPercent:function(_a5,_a6){var ms=this.duration*_a5;d.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_a6);});this._call("gotoPercent",arguments);return this;},stop:function(_a7){this._doAction("stop",arguments);this._call("stop",arguments);return this;},status:function(){return this._pseudoAnimation.status();},destroy:function(){d.forEach(this._connects,dojo.disconnect);}});d.extend(_9b,_8d);dojo.fx.combine=function(_a8){return new _9b(_a8);};dojo.fx.wipeIn=function(_a9){var _aa=_a9.node=d.byId(_a9.node),s=_aa.style,o;var _ab=d.animateProperty(d.mixin({properties:{height:{start:function(){o=s.overflow;s.overflow="hidden";if(s.visibility=="hidden"||s.display=="none"){s.height="1px";s.display="";s.visibility="";return 1;}else{var _ac=d.style(_aa,"height");return Math.max(_ac,1);}},end:function(){return _aa.scrollHeight;}}}},_a9));d.connect(_ab,"onEnd",function(){s.height="auto";s.overflow=o;});return _ab;};dojo.fx.wipeOut=function(_ad){var _ae=_ad.node=d.byId(_ad.node),s=_ae.style,o;var _af=d.animateProperty(d.mixin({properties:{height:{end:1}}},_ad));d.connect(_af,"beforeBegin",function(){o=s.overflow;s.overflow="hidden";s.display="";});d.connect(_af,"onEnd",function(){s.overflow=o;s.height="auto";s.display="none";});return _af;};dojo.fx.slideTo=function(_b0){var _b1=_b0.node=d.byId(_b0.node),top=null,_b2=null;var _b3=(function(n){return function(){var cs=d.getComputedStyle(n);var pos=cs.position;top=(pos=="absolute"?n.offsetTop:parseInt(cs.top)||0);_b2=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);if(pos!="absolute"&&pos!="relative"){var ret=d.position(n,true);top=ret.y;_b2=ret.x;n.style.position="absolute";n.style.top=top+"px";n.style.left=_b2+"px";}};})(_b1);_b3();var _b4=d.animateProperty(d.mixin({properties:{top:_b0.top||0,left:_b0.left||0}},_b0));d.connect(_b4,"beforeBegin",_b4,_b3);return _b4;};})();}if(!dojo._hasResource["dijit.form._FormMixin"]){dojo._hasResource["dijit.form._FormMixin"]=true;dojo.provide("dijit.form._FormMixin");dojo.declare("dijit.form._FormMixin",null,{reset:function(){dojo.forEach(this.getDescendants(),function(_b5){if(_b5.reset){_b5.reset();}});},validate:function(){var _b6=false;return dojo.every(dojo.map(this.getDescendants(),function(_b7){_b7._hasBeenBlurred=true;var _b8=_b7.disabled||!_b7.validate||_b7.validate();if(!_b8&&!_b6){dijit.scrollIntoView(_b7.containerNode||_b7.domNode);_b7.focus();_b6=true;}return _b8;}),function(_b9){return _b9;});},setValues:function(val){dojo.deprecated(this.declaredClass+"::setValues() is deprecated. Use attr('value', val) instead.","","2.0");return this.attr("value",val);},_setValueAttr:function(obj){var map={};dojo.forEach(this.getDescendants(),function(_ba){if(!_ba.name){return;}var _bb=map[_ba.name]||(map[_ba.name]=[]);_bb.push(_ba);});for(var _bc in map){if(!map.hasOwnProperty(_bc)){continue;}var _bd=map[_bc],_be=dojo.getObject(_bc,false,obj);if(_be===undefined){continue;}if(!dojo.isArray(_be)){_be=[_be];}if(typeof _bd[0].checked=="boolean"){dojo.forEach(_bd,function(w,i){w.attr("value",dojo.indexOf(_be,w.value)!=-1);});}else{if(_bd[0].multiple){_bd[0].attr("value",_be);}else{dojo.forEach(_bd,function(w,i){w.attr("value",_be[i]);});}}}},getValues:function(){dojo.deprecated(this.declaredClass+"::getValues() is deprecated. Use attr('value') instead.","","2.0");return this.attr("value");},_getValueAttr:function(){var obj={};dojo.forEach(this.getDescendants(),function(_bf){var _c0=_bf.name;if(!_c0||_bf.disabled){return;}var _c1=_bf.attr("value");if(typeof _bf.checked=="boolean"){if(/Radio/.test(_bf.declaredClass)){if(_c1!==false){dojo.setObject(_c0,_c1,obj);}else{_c1=dojo.getObject(_c0,false,obj);if(_c1===undefined){dojo.setObject(_c0,null,obj);}}}else{var ary=dojo.getObject(_c0,false,obj);if(!ary){ary=[];dojo.setObject(_c0,ary,obj);}if(_c1!==false){ary.push(_c1);}}}else{var _c2=dojo.getObject(_c0,false,obj);if(typeof _c2!="undefined"){if(dojo.isArray(_c2)){_c2.push(_c1);}else{dojo.setObject(_c0,[_c2,_c1],obj);}}else{dojo.setObject(_c0,_c1,obj);}}});return obj;},isValid:function(){this._invalidWidgets=dojo.filter(this.getDescendants(),function(_c3){return !_c3.disabled&&_c3.isValid&&!_c3.isValid();});return !this._invalidWidgets.length;},onValidStateChange:function(_c4){},_widgetChange:function(_c5){var _c6=this._lastValidState;if(!_c5||this._lastValidState===undefined){_c6=this.isValid();if(this._lastValidState===undefined){this._lastValidState=_c6;}}else{if(_c5.isValid){this._invalidWidgets=dojo.filter(this._invalidWidgets||[],function(w){return (w!=_c5);},this);if(!_c5.isValid()&&!_c5.attr("disabled")){this._invalidWidgets.push(_c5);}_c6=(this._invalidWidgets.length===0);}}if(_c6!==this._lastValidState){this._lastValidState=_c6;this.onValidStateChange(_c6);}},connectChildren:function(){dojo.forEach(this._changeConnections,dojo.hitch(this,"disconnect"));var _c7=this;var _c8=this._changeConnections=[];dojo.forEach(dojo.filter(this.getDescendants(),function(_c9){return _c9.validate;}),function(_ca){_c8.push(_c7.connect(_ca,"validate",dojo.hitch(_c7,"_widgetChange",_ca)));_c8.push(_c7.connect(_ca,"_setDisabledAttr",dojo.hitch(_c7,"_widgetChange",_ca)));});this._widgetChange(null);},startup:function(){this.inherited(arguments);this._changeConnections=[];this.connectChildren();}});}if(!dojo._hasResource["dijit._DialogMixin"]){dojo._hasResource["dijit._DialogMixin"]=true;dojo.provide("dijit._DialogMixin");dojo.declare("dijit._DialogMixin",null,{attributeMap:dijit._Widget.prototype.attributeMap,execute:function(_cb){},onCancel:function(){},onExecute:function(){},_onSubmit:function(){this.onExecute();this.execute(this.attr("value"));},_getFocusItems:function(_cc){var _cd=dijit._getTabNavigable(dojo.byId(_cc));this._firstFocusItem=_cd.lowest||_cd.first||_cc;this._lastFocusItem=_cd.last||_cd.highest||this._firstFocusItem;if(dojo.isMoz&&this._firstFocusItem.tagName.toLowerCase()=="input"&&dojo.getNodeProp(this._firstFocusItem,"type").toLowerCase()=="file"){dojo.attr(_cc,"tabIndex","0");this._firstFocusItem=_cc;}}});}if(!dojo._hasResource["dijit.DialogUnderlay"]){dojo._hasResource["dijit.DialogUnderlay"]=true;dojo.provide("dijit.DialogUnderlay");dojo.declare("dijit.DialogUnderlay",[dijit._Widget,dijit._Templated],{templateString:"<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' dojoAttachPoint='node'></div></div>",dialogId:"","class":"",attributeMap:{id:"domNode"},_setDialogIdAttr:function(id){dojo.attr(this.node,"id",id+"_underlay");},_setClassAttr:function(_ce){this.node.className="dijitDialogUnderlay "+_ce;},postCreate:function(){dojo.body().appendChild(this.domNode);},layout:function(){var is=this.node.style,os=this.domNode.style;os.display="none";var _cf=dijit.getViewport();os.top=_cf.t+"px";os.left=_cf.l+"px";is.width=_cf.w+"px";is.height=_cf.h+"px";os.display="block";},show:function(){this.domNode.style.display="block";this.layout();this.bgIframe=new dijit.BackgroundIframe(this.domNode);},hide:function(){this.bgIframe.destroy();this.domNode.style.display="none";},uninitialize:function(){if(this.bgIframe){this.bgIframe.destroy();}this.inherited(arguments);}});}if(!dojo._hasResource["dojo.html"]){dojo._hasResource["dojo.html"]=true;dojo.provide("dojo.html");(function(){var _d0=0,d=dojo;dojo.html._secureForInnerHtml=function(_d1){return _d1.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig,"");};dojo.html._emptyNode=dojo.empty;dojo.html._setNodeContent=function(_d2,_d3){d.empty(_d2);if(_d3){if(typeof _d3=="string"){_d3=d._toDom(_d3,_d2.ownerDocument);}if(!_d3.nodeType&&d.isArrayLike(_d3)){for(var _d4=_d3.length,i=0;i<_d3.length;i=_d4==_d3.length?i+1:0){d.place(_d3[i],_d2,"last");}}else{d.place(_d3,_d2,"last");}}return _d2;};dojo.declare("dojo.html._ContentSetter",null,{node:"",content:"",id:"",cleanContent:false,extractContent:false,parseContent:false,constructor:function(_d5,_d6){dojo.mixin(this,_d5||{});_d6=this.node=dojo.byId(this.node||_d6);if(!this.id){this.id=["Setter",(_d6)?_d6.id||_d6.tagName:"",_d0++].join("_");}if(!(this.node||_d6)){new Error(this.declaredClass+": no node provided to "+this.id);}},set:function(_d7,_d8){if(undefined!==_d7){this.content=_d7;}if(_d8){this._mixin(_d8);}this.onBegin();this.setContent();this.onEnd();return this.node;},setContent:function(){var _d9=this.node;if(!_d9){console.error("setContent given no node");}try{_d9=dojo.html._setNodeContent(_d9,this.content);}catch(e){var _da=this.onContentError(e);try{_d9.innerHTML=_da;}catch(e){console.error("Fatal "+this.declaredClass+".setContent could not change content due to "+e.message,e);}}this.node=_d9;},empty:function(){if(this.parseResults&&this.parseResults.length){dojo.forEach(this.parseResults,function(w){if(w.destroy){w.destroy();}});delete this.parseResults;}dojo.html._emptyNode(this.node);},onBegin:function(){var _db=this.content;if(dojo.isString(_db)){if(this.cleanContent){_db=dojo.html._secureForInnerHtml(_db);}if(this.extractContent){var _dc=_db.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_dc){_db=_dc[1];}}}this.empty();this.content=_db;return this.node;},onEnd:function(){if(this.parseContent){this._parse();}return this.node;},tearDown:function(){delete this.parseResults;delete this.node;delete this.content;},onContentError:function(err){return "Error occured setting content: "+err;},_mixin:function(_dd){var _de={},key;for(key in _dd){if(key in _de){continue;}this[key]=_dd[key];}},_parse:function(){var _df=this.node;try{this.parseResults=dojo.parser.parse(_df,true);}catch(e){this._onError("Content",e,"Error parsing in _ContentSetter#"+this.id);}},_onError:function(_e0,err,_e1){var _e2=this["on"+_e0+"Error"].call(this,err);if(_e1){console.error(_e1,err);}else{if(_e2){dojo.html._setNodeContent(this.node,_e2,true);}}}});dojo.html.set=function(_e3,_e4,_e5){if(undefined==_e4){console.warn("dojo.html.set: no cont argument provided, using empty string");_e4="";}if(!_e5){return dojo.html._setNodeContent(_e3,_e4,true);}else{var op=new dojo.html._ContentSetter(dojo.mixin(_e5,{content:_e4,node:_e3}));return op.set();}};})();}if(!dojo._hasResource["dijit.layout.ContentPane"]){dojo._hasResource["dijit.layout.ContentPane"]=true;dojo.provide("dijit.layout.ContentPane");dojo.declare("dijit.layout.ContentPane",dijit._Widget,{href:"",extractContent:false,parseOnLoad:true,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'>${errorState}</span>",isLoaded:false,baseClass:"dijitContentPane",doLayout:true,ioArgs:{},isContainer:true,isLayoutContainer:true,onLoadDeferred:null,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{title:[]}),postMixInProperties:function(){this.inherited(arguments);var _e6=dojo.i18n.getLocalization("dijit","loading",this.lang);this.loadingMessage=dojo.string.substitute(this.loadingMessage,_e6);this.errorMessage=dojo.string.substitute(this.errorMessage,_e6);if(!this.href&&this.srcNodeRef&&this.srcNodeRef.innerHTML){this.isLoaded=true;}},buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}},postCreate:function(){this.domNode.title="";if(!dojo.attr(this.domNode,"role")){dijit.setWaiRole(this.domNode,"group");}dojo.addClass(this.domNode,this.baseClass);},startup:function(){if(this._started){return;}var _e7=dijit._Contained.prototype.getParent.call(this);this._childOfLayoutWidget=_e7&&_e7.isLayoutContainer;this._needLayout=!this._childOfLayoutWidget;if(this.isLoaded){dojo.forEach(this.getChildren(),function(_e8){_e8.startup();});}if(this._isShown()||this.preload){this._onShow();}this.inherited(arguments);},_checkIfSingleChild:function(){var _e9=dojo.query("> *",this.containerNode).filter(function(_ea){return _ea.tagName!=="SCRIPT";}),_eb=_e9.filter(function(_ec){return dojo.hasAttr(_ec,"dojoType")||dojo.hasAttr(_ec,"widgetId");}),_ed=dojo.filter(_eb.map(dijit.byNode),function(_ee){return _ee&&_ee.domNode&&_ee.resize;});if(_e9.length==_eb.length&&_ed.length==1){this._singleChild=_ed[0];}else{delete this._singleChild;}dojo.toggleClass(this.containerNode,this.baseClass+"SingleChild",!!this._singleChild);},setHref:function(_ef){dojo.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use attr('href', ...) instead.","","2.0");return this.attr("href",_ef);},_setHrefAttr:function(_f0){this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));this.href=_f0;if(this._created&&(this.preload||this._isShown())){this._load();}else{this._hrefChanged=true;}return this.onLoadDeferred;},setContent:function(_f1){dojo.deprecated("dijit.layout.ContentPane.setContent() is deprecated.  Use attr('content', ...) instead.","","2.0");this.attr("content",_f1);},_setContentAttr:function(_f2){this.href="";this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));this._setContent(_f2||"");this._isDownloaded=false;return this.onLoadDeferred;},_getContentAttr:function(){return this.containerNode.innerHTML;},cancel:function(){if(this._xhrDfd&&(this._xhrDfd.fired==-1)){this._xhrDfd.cancel();}delete this._xhrDfd;this.onLoadDeferred=null;},uninitialize:function(){if(this._beingDestroyed){this.cancel();}this.inherited(arguments);},destroyRecursive:function(_f3){if(this._beingDestroyed){return;}this.inherited(arguments);},resize:function(_f4,_f5){if(!this._wasShown){this._onShow();}this._resizeCalled=true;if(_f4){dojo.marginBox(this.domNode,_f4);}var cn=this.containerNode;if(cn===this.domNode){var mb=_f5||{};dojo.mixin(mb,_f4||{});if(!("h" in mb)||!("w" in mb)){mb=dojo.mixin(dojo.marginBox(cn),mb);}this._contentBox=dijit.layout.marginBox2contentBox(cn,mb);}else{this._contentBox=dojo.contentBox(cn);}this._layoutChildren();},_isShown:function(){if(this._childOfLayoutWidget){if(this._resizeCalled&&"open" in this){return this.open;}return this._resizeCalled;}else{if("open" in this){return this.open;}else{var _f6=this.domNode;return (_f6.style.display!="none")&&(_f6.style.visibility!="hidden")&&!dojo.hasClass(_f6,"dijitHidden");}}},_onShow:function(){if(this.href){if(!this._xhrDfd&&(!this.isLoaded||this._hrefChanged||this.refreshOnShow)){this.refresh();}}else{if(!this._childOfLayoutWidget&&this._needLayout){this._layoutChildren();}}this.inherited(arguments);this._wasShown=true;},refresh:function(){this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));this._load();return this.onLoadDeferred;},_load:function(){this._setContent(this.onDownloadStart(),true);var _f7=this;var _f8={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(dojo.isObject(this.ioArgs)){dojo.mixin(_f8,this.ioArgs);}var _f9=(this._xhrDfd=(this.ioMethod||dojo.xhrGet)(_f8));_f9.addCallback(function(_fa){try{_f7._isDownloaded=true;_f7._setContent(_fa,false);_f7.onDownloadEnd();}catch(err){_f7._onError("Content",err);}delete _f7._xhrDfd;return _fa;});_f9.addErrback(function(err){if(!_f9.canceled){_f7._onError("Download",err);}delete _f7._xhrDfd;return err;});delete this._hrefChanged;},_onLoadHandler:function(_fb){this.isLoaded=true;try{this.onLoadDeferred.callback(_fb);this.onLoad(_fb);}catch(e){console.error("Error "+this.widgetId+" running custom onLoad code: "+e.message);}},_onUnloadHandler:function(){this.isLoaded=false;try{this.onUnload();}catch(e){console.error("Error "+this.widgetId+" running custom onUnload code: "+e.message);}},destroyDescendants:function(){if(this.isLoaded){this._onUnloadHandler();}var _fc=this._contentSetter;dojo.forEach(this.getChildren(),function(_fd){if(_fd.destroyRecursive){_fd.destroyRecursive();}});if(_fc){dojo.forEach(_fc.parseResults,function(_fe){if(_fe.destroyRecursive&&_fe.domNode&&_fe.domNode.parentNode==dojo.body()){_fe.destroyRecursive();}});delete _fc.parseResults;}dojo.html._emptyNode(this.containerNode);delete this._singleChild;},_setContent:function(_ff,_100){this.destroyDescendants();var _101=this._contentSetter;if(!(_101&&_101 instanceof dojo.html._ContentSetter)){_101=this._contentSetter=new dojo.html._ContentSetter({node:this.containerNode,_onError:dojo.hitch(this,this._onError),onContentError:dojo.hitch(this,function(e){var _102=this.onContentError(e);try{this.containerNode.innerHTML=_102;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}})});}var _103=dojo.mixin({cleanContent:this.cleanContent,extractContent:this.extractContent,parseContent:this.parseOnLoad},this._contentSetterParams||{});dojo.mixin(_101,_103);_101.set((dojo.isObject(_ff)&&_ff.domNode)?_ff.domNode:_ff);delete this._contentSetterParams;if(!_100){dojo.forEach(this.getChildren(),function(_104){if(!this.parseOnLoad||_104.getParent){_104.startup();}},this);this._scheduleLayout();this._onLoadHandler(_ff);}},_onError:function(type,err,_105){this.onLoadDeferred.errback(err);var _106=this["on"+type+"Error"].call(this,err);if(_105){console.error(_105,err);}else{if(_106){this._setContent(_106,true);}}},_scheduleLayout:function(){if(this._isShown()){this._layoutChildren();}else{this._needLayout=true;}},_layoutChildren:function(){if(this.doLayout){this._checkIfSingleChild();}if(this._singleChild&&this._singleChild.resize){var cb=this._contentBox||dojo.contentBox(this.containerNode);this._singleChild.resize({w:cb.w,h:cb.h});}else{dojo.forEach(this.getChildren(),function(_107){if(_107.resize){_107.resize();}});}delete this._needLayout;},onLoad:function(data){},onUnload:function(){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(_108){},onDownloadError:function(_109){return this.errorMessage;},onDownloadEnd:function(){}});}if(!dojo._hasResource["dijit.TooltipDialog"]){dojo._hasResource["dijit.TooltipDialog"]=true;dojo.provide("dijit.TooltipDialog");dojo.declare("dijit.TooltipDialog",[dijit.layout.ContentPane,dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin],{title:"",doLayout:false,autofocus:true,baseClass:"dijitTooltipDialog",_firstFocusItem:null,_lastFocusItem:null,templateString:dojo.cache("dijit","templates/TooltipDialog.html","<div waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" waiRole=\"presentation\"></div>\n</div>\n"),postCreate:function(){this.inherited(arguments);this.connect(this.containerNode,"onkeypress","_onKey");this.containerNode.title=this.title;},orient:function(node,_10a,_10b){var c=this._currentOrientClass;if(c){dojo.removeClass(this.domNode,c);}c="dijitTooltipAB"+(_10b.charAt(1)=="L"?"Left":"Right")+" dijitTooltip"+(_10b.charAt(0)=="T"?"Below":"Above");dojo.addClass(this.domNode,c);this._currentOrientClass=c;},onOpen:function(pos){this.orient(this.domNode,pos.aroundCorner,pos.corner);this._onShow();if(this.autofocus){this._getFocusItems(this.containerNode);dijit.focus(this._firstFocusItem);}},onClose:function(){this.onHide();},_onKey:function(evt){var node=evt.target;var dk=dojo.keys;if(evt.charOrCode===dk.TAB){this._getFocusItems(this.containerNode);}var _10c=(this._firstFocusItem==this._lastFocusItem);if(evt.charOrCode==dk.ESCAPE){setTimeout(dojo.hitch(this,"onCancel"),0);dojo.stopEvent(evt);}else{if(node==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===dk.TAB){if(!_10c){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===dk.TAB&&!evt.shiftKey){if(!_10c){dijit.focus(this._firstFocusItem);}dojo.stopEvent(evt);}else{if(evt.charOrCode===dk.TAB){evt.stopPropagation();}}}}}});}if(!dojo._hasResource["dijit.Dialog"]){dojo._hasResource["dijit.Dialog"]=true;dojo.provide("dijit.Dialog");dojo.declare("dijit._DialogBase",[dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin],{templateString:dojo.cache("dijit","templates/Dialog.html","<div class=\"dijitDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"labelledby-${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span dojoAttachPoint=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"></span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"onclick: onCancel, onmouseenter: _onCloseEnter, onmouseleave: _onCloseLeave\" title=\"${buttonCancel}\">\n\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t</span>\n\t</div>\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n"),attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{title:[{node:"titleNode",type:"innerHTML"},{node:"titleBar",type:"attribute"}],"aria-describedby":""}),open:false,duration:dijit.defaultDuration,refocus:true,autofocus:true,_firstFocusItem:null,_lastFocusItem:null,doLayout:false,draggable:true,"aria-describedby":"",postMixInProperties:function(){var _10d=dojo.i18n.getLocalization("dijit","common");dojo.mixin(this,_10d);this.inherited(arguments);},postCreate:function(){dojo.style(this.domNode,{display:"none",position:"absolute"});dojo.body().appendChild(this.domNode);this.inherited(arguments);this.connect(this,"onExecute","hide");this.connect(this,"onCancel","hide");this._modalconnects=[];},onLoad:function(){this._position();this.inherited(arguments);},_endDrag:function(e){if(e&&e.node&&e.node===this.domNode){this._relativePosition=dojo.position(e.node);}},_setup:function(){var node=this.domNode;if(this.titleBar&&this.draggable){this._moveable=(dojo.isIE==6)?new dojo.dnd.TimedMoveable(node,{handle:this.titleBar}):new dojo.dnd.Moveable(node,{handle:this.titleBar,timeout:0});dojo.subscribe("/dnd/move/stop",this,"_endDrag");}else{dojo.addClass(node,"dijitDialogFixed");}this.underlayAttrs={dialogId:this.id,"class":dojo.map(this["class"].split(/\s/),function(s){return s+"_underlay";}).join(" ")};this._fadeIn=dojo.fadeIn({node:node,duration:this.duration,beforeBegin:dojo.hitch(this,function(){var _10e=dijit._underlay;if(!_10e){_10e=dijit._underlay=new dijit.DialogUnderlay(this.underlayAttrs);}else{_10e.attr(this.underlayAttrs);}var _10f=948+dijit._dialogStack.length*2;dojo.style(dijit._underlay.domNode,"zIndex",_10f);dojo.style(this.domNode,"zIndex",_10f+1);_10e.show();}),onEnd:dojo.hitch(this,function(){if(this.autofocus){this._getFocusItems(this.domNode);dijit.focus(this._firstFocusItem);}})});this._fadeOut=dojo.fadeOut({node:node,duration:this.duration,onEnd:dojo.hitch(this,function(){node.style.display="none";var ds=dijit._dialogStack;if(ds.length==0){dijit._underlay.hide();}else{dojo.style(dijit._underlay.domNode,"zIndex",948+ds.length*2);dijit._underlay.attr(ds[ds.length-1].underlayAttrs);}if(this.refocus){var _110=this._savedFocus;if(ds.length>0){var pd=ds[ds.length-1];if(!dojo.isDescendant(_110.node,pd.domNode)){pd._getFocusItems(pd.domNode);_110=pd._firstFocusItem;}}dijit.focus(_110);}})});},uninitialize:function(){var _111=false;if(this._fadeIn&&this._fadeIn.status()=="playing"){_111=true;this._fadeIn.stop();}if(this._fadeOut&&this._fadeOut.status()=="playing"){_111=true;this._fadeOut.stop();}if((this.open||_111)&&!dijit._underlay._destroyed){dijit._underlay.hide();}if(this._moveable){this._moveable.destroy();}this.inherited(arguments);},_size:function(){this._checkIfSingleChild();if(this._singleChild){if(this._singleChildOriginalStyle){this._singleChild.domNode.style.cssText=this._singleChildOriginalStyle;}delete this._singleChildOriginalStyle;}else{dojo.style(this.containerNode,{width:"auto",height:"auto"});}var mb=dojo.marginBox(this.domNode);var _112=dijit.getViewport();if(mb.w>=_112.w||mb.h>=_112.h){var w=Math.min(mb.w,Math.floor(_112.w*0.75)),h=Math.min(mb.h,Math.floor(_112.h*0.75));if(this._singleChild&&this._singleChild.resize){this._singleChildOriginalStyle=this._singleChild.domNode.style.cssText;this._singleChild.resize({w:w,h:h});}else{dojo.style(this.containerNode,{width:w+"px",height:h+"px",overflow:"auto",position:"relative"});}}else{if(this._singleChild&&this._singleChild.resize){this._singleChild.resize();}}},_position:function(){if(!dojo.hasClass(dojo.body(),"dojoMove")){var node=this.domNode,_113=dijit.getViewport(),p=this._relativePosition,bb=p?null:dojo._getBorderBox(node),l=Math.floor(_113.l+(p?p.x:(_113.w-bb.w)/2)),t=Math.floor(_113.t+(p?p.y:(_113.h-bb.h)/2));dojo.style(node,{left:l+"px",top:t+"px"});}},_onKey:function(evt){var ds=dijit._dialogStack;if(ds[ds.length-1]!=this){return;}if(evt.charOrCode){var dk=dojo.keys;var node=evt.target;if(evt.charOrCode===dk.TAB){this._getFocusItems(this.domNode);}var _114=(this._firstFocusItem==this._lastFocusItem);if(node==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===dk.TAB){if(!_114){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===dk.TAB&&!evt.shiftKey){if(!_114){dijit.focus(this._firstFocusItem);}dojo.stopEvent(evt);}else{while(node){if(node==this.domNode||dojo.hasClass(node,"dijitPopup")){if(evt.charOrCode==dk.ESCAPE){this.onCancel();}else{return;}}node=node.parentNode;}if(evt.charOrCode!==dk.TAB){dojo.stopEvent(evt);}else{if(!dojo.isOpera){try{this._firstFocusItem.focus();}catch(e){}}}}}}},show:function(){if(this.open){return;}if(!this._alreadyInitialized){this._setup();this._alreadyInitialized=true;}if(this._fadeOut.status()=="playing"){this._fadeOut.stop();}this._modalconnects.push(dojo.connect(window,"onscroll",this,"layout"));this._modalconnects.push(dojo.connect(window,"onresize",this,function(){var _115=dijit.getViewport();if(!this._oldViewport||_115.h!=this._oldViewport.h||_115.w!=this._oldViewport.w){this.layout();this._oldViewport=_115;}}));this._modalconnects.push(dojo.connect(dojo.doc.documentElement,"onkeypress",this,"_onKey"));dojo.style(this.domNode,{opacity:0,display:""});this.open=true;this._onShow();this._size();this._position();dijit._dialogStack.push(this);this._fadeIn.play();this._savedFocus=dijit.getFocus(this);},hide:function(){var ds=dijit._dialogStack;if(!this._alreadyInitialized||this!=ds[ds.length-1]){return;}if(this._fadeIn.status()=="playing"){this._fadeIn.stop();}ds.pop();this._fadeOut.play();if(this._scrollConnected){this._scrollConnected=false;}dojo.forEach(this._modalconnects,dojo.disconnect);this._modalconnects=[];if(this._relativePosition){delete this._relativePosition;}this.open=false;this.onHide();},layout:function(){if(this.domNode.style.display!="none"){if(dijit._underlay){dijit._underlay.layout();}this._position();}},destroy:function(){dojo.forEach(this._modalconnects,dojo.disconnect);if(this.refocus&&this.open){setTimeout(dojo.hitch(dijit,"focus",this._savedFocus),25);}this.inherited(arguments);},_onCloseEnter:function(){dojo.addClass(this.closeButtonNode,"dijitDialogCloseIcon-hover");},_onCloseLeave:function(){dojo.removeClass(this.closeButtonNode,"dijitDialogCloseIcon-hover");}});dojo.declare("dijit.Dialog",[dijit.layout.ContentPane,dijit._DialogBase],{});dijit._dialogStack=[];}if(!dojo._hasResource["dijit._editor.selection"]){dojo._hasResource["dijit._editor.selection"]=true;dojo.provide("dijit._editor.selection");dojo.mixin(dijit._editor.selection,{getType:function(){if(dojo.isIE){return dojo.doc.selection.type.toLowerCase();}else{var _116="text";var oSel;try{oSel=dojo.global.getSelection();}catch(e){}if(oSel&&oSel.rangeCount==1){var _117=oSel.getRangeAt(0);if((_117.startContainer==_117.endContainer)&&((_117.endOffset-_117.startOffset)==1)&&(_117.startContainer.nodeType!=3)){_116="control";}}return _116;}},getSelectedText:function(){if(dojo.isIE){if(dijit._editor.selection.getType()=="control"){return null;}return dojo.doc.selection.createRange().text;}else{var _118=dojo.global.getSelection();if(_118){return _118.toString();}}return "";},getSelectedHtml:function(){if(dojo.isIE){if(dijit._editor.selection.getType()=="control"){return null;}return dojo.doc.selection.createRange().htmlText;}else{var _119=dojo.global.getSelection();if(_119&&_119.rangeCount){var i;var html="";for(i=0;i<_119.rangeCount;i++){var frag=_119.getRangeAt(i).cloneContents();var div=dojo.doc.createElement("div");div.appendChild(frag);html+=div.innerHTML;}return html;}return null;}},getSelectedElement:function(){if(dijit._editor.selection.getType()=="control"){if(dojo.isIE){var _11a=dojo.doc.selection.createRange();if(_11a&&_11a.item){return dojo.doc.selection.createRange().item(0);}}else{var _11b=dojo.global.getSelection();return _11b.anchorNode.childNodes[_11b.anchorOffset];}}return null;},getParentElement:function(){if(dijit._editor.selection.getType()=="control"){var p=this.getSelectedElement();if(p){return p.parentNode;}}else{if(dojo.isIE){var r=dojo.doc.selection.createRange();r.collapse(true);return r.parentElement();}else{var _11c=dojo.global.getSelection();if(_11c){var node=_11c.anchorNode;while(node&&(node.nodeType!=1)){node=node.parentNode;}return node;}}}return null;},hasAncestorElement:function(_11d){return this.getAncestorElement.apply(this,arguments)!=null;},getAncestorElement:function(_11e){var node=this.getSelectedElement()||this.getParentElement();return this.getParentOfType(node,arguments);},isTag:function(node,tags){if(node&&node.tagName){var _11f=node.tagName.toLowerCase();for(var i=0;i<tags.length;i++){var _120=String(tags[i]).toLowerCase();if(_11f==_120){return _120;}}}return "";},getParentOfType:function(node,tags){while(node){if(this.isTag(node,tags).length){return node;}node=node.parentNode;}return null;},collapse:function(_121){if(window.getSelection){var _122=dojo.global.getSelection();if(_122.removeAllRanges){if(_121){_122.collapseToStart();}else{_122.collapseToEnd();}}else{_122.collapse(_121);}}else{if(dojo.isIE){var _123=dojo.doc.selection.createRange();_123.collapse(_121);_123.select();}}},remove:function(){var sel=dojo.doc.selection;if(dojo.isIE){if(sel.type.toLowerCase()!="none"){sel.clear();}return sel;}else{sel=dojo.global.getSelection();sel.deleteFromDocument();return sel;}},selectElementChildren:function(_124,_125){var win=dojo.global;var doc=dojo.doc;var _126;_124=dojo.byId(_124);if(doc.selection&&dojo.isIE&&dojo.body().createTextRange){_126=_124.ownerDocument.body.createTextRange();_126.moveToElementText(_124);if(!_125){try{_126.select();}catch(e){}}}else{if(win.getSelection){var _127=dojo.global.getSelection();if(_127.setBaseAndExtent){_127.setBaseAndExtent(_124,0,_124,_124.innerText.length-1);}else{if(dojo.isOpera){if(_127.rangeCount){_126=_127.getRangeAt(0);}else{_126=doc.createRange();}_126.setStart(_124,0);_126.setEnd(_124,(_124.nodeType==3)?_124.length:_124.childNodes.length);_127.addRange(_126);}else{if(_127.selectAllChildren){_127.selectAllChildren(_124);}}}}}},selectElement:function(_128,_129){var _12a;var doc=dojo.doc;var win=dojo.global;_128=dojo.byId(_128);if(dojo.isIE&&dojo.body().createTextRange){try{_12a=dojo.body().createControlRange();_12a.addElement(_128);if(!_129){_12a.select();}}catch(e){this.selectElementChildren(_128,_129);}}else{if(dojo.global.getSelection){var _12b=win.getSelection();_12a=doc.createRange();if(_12b.removeAllRanges){if(dojo.isOpera){if(_12b.getRangeAt(0)){_12a=_12b.getRangeAt(0);}}_12a.selectNode(_128);_12b.removeAllRanges();_12b.addRange(_12a);}}}}});}if(!dojo._hasResource["dijit._editor.range"]){dojo._hasResource["dijit._editor.range"]=true;dojo.provide("dijit._editor.range");dijit.range={};dijit.range.getIndex=function(node,_12c){var ret=[],retR=[];var stop=_12c;var _12d=node;var _12e,n;while(node!=stop){var i=0;_12e=node.parentNode;while((n=_12e.childNodes[i++])){if(n===node){--i;break;}}if(i>=_12e.childNodes.length){dojo.debug("Error finding index of a node in dijit.range.getIndex");}ret.unshift(i);retR.unshift(i-_12e.childNodes.length);node=_12e;}if(ret.length>0&&_12d.nodeType==3){n=_12d.previousSibling;while(n&&n.nodeType==3){ret[ret.length-1]--;n=n.previousSibling;}n=_12d.nextSibling;while(n&&n.nodeType==3){retR[retR.length-1]++;n=n.nextSibling;}}return {o:ret,r:retR};};dijit.range.getNode=function(_12f,_130){if(!dojo.isArray(_12f)||_12f.length==0){return _130;}var node=_130;dojo.every(_12f,function(i){if(i>=0&&i<node.childNodes.length){node=node.childNodes[i];}else{node=null;return false;}return true;});return node;};dijit.range.getCommonAncestor=function(n1,n2){var _131=function(n){var as=[];while(n){as.unshift(n);if(n.nodeName!="BODY"){n=n.parentNode;}else{break;}}return as;};var n1as=_131(n1);var n2as=_131(n2);var m=Math.min(n1as.length,n2as.length);var com=n1as[0];for(var i=1;i<m;i++){if(n1as[i]===n2as[i]){com=n1as[i];}else{break;}}return com;};dijit.range.getAncestor=function(node,_132,root){root=root||node.ownerDocument.body;while(node&&node!==root){var name=node.nodeName.toUpperCase();if(_132.test(name)){return node;}node=node.parentNode;}return null;};dijit.range.BlockTagNames=/^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/;dijit.range.getBlockAncestor=function(node,_133,root){root=root||node.ownerDocument.body;_133=_133||dijit.range.BlockTagNames;var _134=null,_135;while(node&&node!==root){var name=node.nodeName.toUpperCase();if(!_134&&_133.test(name)){_134=node;}if(!_135&&(/^(?:BODY|TD|TH|CAPTION)$/).test(name)){_135=node;}node=node.parentNode;}return {blockNode:_134,blockContainer:_135||node.ownerDocument.body};};dijit.range.atBeginningOfContainer=function(_136,node,_137){var _138=false;var _139=(_137==0);if(!_139&&node.nodeType==3){if(/^[\s\xA0]+$/.test(node.nodeValue.substr(0,_137))){_139=true;}}if(_139){var _13a=node;_138=true;while(_13a&&_13a!==_136){if(_13a.previousSibling){_138=false;break;}_13a=_13a.parentNode;}}return _138;};dijit.range.atEndOfContainer=function(_13b,node,_13c){var _13d=false;var _13e=(_13c==(node.length||node.childNodes.length));if(!_13e&&node.nodeType==3){if(/^[\s\xA0]+$/.test(node.nodeValue.substr(_13c))){_13e=true;}}if(_13e){var _13f=node;_13d=true;while(_13f&&_13f!==_13b){if(_13f.nextSibling){_13d=false;break;}_13f=_13f.parentNode;}}return _13d;};dijit.range.adjacentNoneTextNode=function(_140,next){var node=_140;var len=(0-_140.length)||0;var prop=next?"nextSibling":"previousSibling";while(node){if(node.nodeType!=3){break;}len+=node.length;node=node[prop];}return [node,len];};dijit.range._w3c=Boolean(window["getSelection"]);dijit.range.create=function(win){if(dijit.range._w3c){return (win||dojo.global).document.createRange();}else{return new dijit.range.W3CRange;}};dijit.range.getSelection=function(win,_141){if(dijit.range._w3c){return win.getSelection();}else{var s=new dijit.range.ie.selection(win);if(!_141){s._getCurrentSelection();}return s;}};if(!dijit.range._w3c){dijit.range.ie={cachedSelection:{},selection:function(win){this._ranges=[];this.addRange=function(r,_142){this._ranges.push(r);if(!_142){r._select();}this.rangeCount=this._ranges.length;};this.removeAllRanges=function(){this._ranges=[];this.rangeCount=0;};var _143=function(){var r=win.document.selection.createRange();var type=win.document.selection.type.toUpperCase();if(type=="CONTROL"){return new dijit.range.W3CRange(dijit.range.ie.decomposeControlRange(r));}else{return new dijit.range.W3CRange(dijit.range.ie.decomposeTextRange(r));}};this.getRangeAt=function(i){return this._ranges[i];};this._getCurrentSelection=function(){this.removeAllRanges();var r=_143();if(r){this.addRange(r,true);}};},decomposeControlRange:function(_144){var _145=_144.item(0),_146=_144.item(_144.length-1);var _147=_145.parentNode,_148=_146.parentNode;var _149=dijit.range.getIndex(_145,_147).o;var _14a=dijit.range.getIndex(_146,_148).o+1;return [_147,_149,_148,_14a];},getEndPoint:function(_14b,end){var _14c=_14b.duplicate();_14c.collapse(!end);var _14d="EndTo"+(end?"End":"Start");var _14e=_14c.parentElement();var _14f,_150,_151;if(_14e.childNodes.length>0){dojo.every(_14e.childNodes,function(node,i){var _152;if(node.nodeType!=3){_14c.moveToElementText(node);if(_14c.compareEndPoints(_14d,_14b)>0){if(_151&&_151.nodeType==3){_14f=_151;_152=true;}else{_14f=_14e;_150=i;return false;}}else{if(i==_14e.childNodes.length-1){_14f=_14e;_150=_14e.childNodes.length;return false;}}}else{if(i==_14e.childNodes.length-1){_14f=node;_152=true;}}if(_152&&_14f){var _153=dijit.range.adjacentNoneTextNode(_14f)[0];if(_153){_14f=_153.nextSibling;}else{_14f=_14e.firstChild;}var _154=dijit.range.adjacentNoneTextNode(_14f);_153=_154[0];var _155=_154[1];if(_153){_14c.moveToElementText(_153);_14c.collapse(false);}else{_14c.moveToElementText(_14e);}_14c.setEndPoint(_14d,_14b);_150=_14c.text.length-_155;return false;}_151=node;return true;});}else{_14f=_14e;_150=0;}if(!end&&_14f.nodeType==1&&_150==_14f.childNodes.length){var _156=_14f.nextSibling;if(_156&&_156.nodeType==3){_14f=_156;_150=0;}}return [_14f,_150];},setEndPoint:function(_157,_158,_159){var _15a=_157.duplicate(),node,len;if(_158.nodeType!=3){if(_159>0){node=_158.childNodes[_159-1];if(node.nodeType==3){_158=node;_159=node.length;}else{if(node.nextSibling&&node.nextSibling.nodeType==3){_158=node.nextSibling;_159=0;}else{_15a.moveToElementText(node.nextSibling?node:_158);var _15b=node.parentNode;var _15c=_15b.insertBefore(node.ownerDocument.createTextNode(" "),node.nextSibling);_15a.collapse(false);_15b.removeChild(_15c);}}}else{_15a.moveToElementText(_158);_15a.collapse(true);}}if(_158.nodeType==3){var _15d=dijit.range.adjacentNoneTextNode(_158);var _15e=_15d[0];len=_15d[1];if(_15e){_15a.moveToElementText(_15e);_15a.collapse(false);if(_15e.contentEditable!="inherit"){len++;}}else{_15a.moveToElementText(_158.parentNode);_15a.collapse(true);}_159+=len;if(_159>0){if(_15a.move("character",_159)!=_159){console.error("Error when moving!");}}}return _15a;},decomposeTextRange:function(_15f){var _160=dijit.range.ie.getEndPoint(_15f);var _161=_160[0],_162=_160[1];var _163=_160[0],_164=_160[1];if(_15f.htmlText.length){if(_15f.htmlText==_15f.text){_164=_162+_15f.text.length;}else{_160=dijit.range.ie.getEndPoint(_15f,true);_163=_160[0],_164=_160[1];}}return [_161,_162,_163,_164];},setRange:function(_165,_166,_167,_168,_169,_16a){var _16b=dijit.range.ie.setEndPoint(_165,_166,_167);_165.setEndPoint("StartToStart",_16b);if(!_16a){var end=dijit.range.ie.setEndPoint(_165,_168,_169);}_165.setEndPoint("EndToEnd",end||_16b);return _165;}};dojo.declare("dijit.range.W3CRange",null,{constructor:function(){if(arguments.length>0){this.setStart(arguments[0][0],arguments[0][1]);this.setEnd(arguments[0][2],arguments[0][3]);}else{this.commonAncestorContainer=null;this.startContainer=null;this.startOffset=0;this.endContainer=null;this.endOffset=0;this.collapsed=true;}},_updateInternal:function(){if(this.startContainer!==this.endContainer){this.commonAncestorContainer=dijit.range.getCommonAncestor(this.startContainer,this.endContainer);}else{this.commonAncestorContainer=this.startContainer;}this.collapsed=(this.startContainer===this.endContainer)&&(this.startOffset==this.endOffset);},setStart:function(node,_16c){_16c=parseInt(_16c);if(this.startContainer===node&&this.startOffset==_16c){return;}delete this._cachedBookmark;this.startContainer=node;this.startOffset=_16c;if(!this.endContainer){this.setEnd(node,_16c);}else{this._updateInternal();}},setEnd:function(node,_16d){_16d=parseInt(_16d);if(this.endContainer===node&&this.endOffset==_16d){return;}delete this._cachedBookmark;this.endContainer=node;this.endOffset=_16d;if(!this.startContainer){this.setStart(node,_16d);}else{this._updateInternal();}},setStartAfter:function(node,_16e){this._setPoint("setStart",node,_16e,1);},setStartBefore:function(node,_16f){this._setPoint("setStart",node,_16f,0);},setEndAfter:function(node,_170){this._setPoint("setEnd",node,_170,1);},setEndBefore:function(node,_171){this._setPoint("setEnd",node,_171,0);},_setPoint:function(what,node,_172,ext){var _173=dijit.range.getIndex(node,node.parentNode).o;this[what](node.parentNode,_173.pop()+ext);},_getIERange:function(){var r=(this._body||this.endContainer.ownerDocument.body).createTextRange();dijit.range.ie.setRange(r,this.startContainer,this.startOffset,this.endContainer,this.endOffset,this.collapsed);return r;},getBookmark:function(body){this._getIERange();return this._cachedBookmark;},_select:function(){var r=this._getIERange();r.select();},deleteContents:function(){var r=this._getIERange();r.pasteHTML("");this.endContainer=this.startContainer;this.endOffset=this.startOffset;this.collapsed=true;},cloneRange:function(){var r=new dijit.range.W3CRange([this.startContainer,this.startOffset,this.endContainer,this.endOffset]);r._body=this._body;return r;},detach:function(){this._body=null;this.commonAncestorContainer=null;this.startContainer=null;this.startOffset=0;this.endContainer=null;this.endOffset=0;this.collapsed=true;}});}}if(!dojo._hasResource["dijit._editor.html"]){dojo._hasResource["dijit._editor.html"]=true;dojo.provide("dijit._editor.html");dijit._editor.escapeXml=function(str,_174){str=str.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");if(!_174){str=str.replace(/'/gm,"&#39;");}return str;};dijit._editor.getNodeHtml=function(node){var _175;switch(node.nodeType){case 1:var _176=node.nodeName.toLowerCase();if(_176.charAt(0)=="/"){return "";}_175="<"+_176;var _177=[];var attr;if(dojo.isIE&&node.outerHTML){var s=node.outerHTML;s=s.substr(0,s.indexOf(">")).replace(/(['"])[^"']*\1/g,"");var reg=/(\b\w+)\s?=/g;var m,key;while((m=reg.exec(s))){key=m[1];if(key.substr(0,3)!="_dj"){if(key=="src"||key=="href"){if(node.getAttribute("_djrealurl")){_177.push([key,node.getAttribute("_djrealurl")]);continue;}}var val,_178;switch(key){case "style":val=node.style.cssText.toLowerCase();break;case "class":val=node.className;break;case "width":if(_176==="img"){_178=/width=(\S+)/i.exec(s);if(_178){val=_178[1];}break;}case "height":if(_176==="img"){_178=/height=(\S+)/i.exec(s);if(_178){val=_178[1];}break;}default:val=node.getAttribute(key);}if(val!=null){_177.push([key,val.toString()]);}}}}else{var i=0;while((attr=node.attributes[i++])){var n=attr.name;if(n.substr(0,3)!="_dj"){var v=attr.value;if(n=="src"||n=="href"){if(node.getAttribute("_djrealurl")){v=node.getAttribute("_djrealurl");}}_177.push([n,v]);}}}_177.sort(function(a,b){return a[0]<b[0]?-1:(a[0]==b[0]?0:1);});var j=0;while((attr=_177[j++])){_175+=" "+attr[0]+"=\""+(dojo.isString(attr[1])?dijit._editor.escapeXml(attr[1],true):attr[1])+"\"";}if(_176==="script"){_175+=">"+node.innerHTML+"</"+_176+">";}else{if(node.childNodes.length){_175+=">"+dijit._editor.getChildrenHtml(node)+"</"+_176+">";}else{switch(_176){case "br":case "hr":case "img":case "input":case "base":case "meta":case "area":case "basefont":_175+=" />";break;default:_175+="></"+_176+">";}}}break;case 4:case 3:_175=dijit._editor.escapeXml(node.nodeValue,true);break;case 8:_175="<!--"+dijit._editor.escapeXml(node.nodeValue,true)+"-->";break;default:_175="<!-- Element not recognized - Type: "+node.nodeType+" Name: "+node.nodeName+"-->";}return _175;};dijit._editor.getChildrenHtml=function(dom){var out="";if(!dom){return out;}var _179=dom["childNodes"]||dom;var _17a=!dojo.isIE||_179!==dom;var node,i=0;while((node=_179[i++])){if(!_17a||node.parentNode==dom){out+=dijit._editor.getNodeHtml(node);}}return out;};}if(!dojo._hasResource["dijit._editor.RichText"]){dojo._hasResource["dijit._editor.RichText"]=true;dojo.provide("dijit._editor.RichText");if(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"]){if(dojo._postLoad){(function(){var _17b=dojo.doc.createElement("textarea");_17b.id=dijit._scopeName+"._editor.RichText.savedContent";dojo.style(_17b,{display:"none",position:"absolute",top:"-100px",height:"3px",width:"3px"});dojo.body().appendChild(_17b);})();}else{try{dojo.doc.write("<textarea id=\""+dijit._scopeName+"._editor.RichText.savedContent\" "+"style=\"display:none;position:absolute;top:-100px;left:-100px;height:3px;width:3px;overflow:hidden;\"></textarea>");}catch(e){}}}dojo.declare("dijit._editor.RichText",dijit._Widget,{constructor:function(_17c){this.contentPreFilters=[];this.contentPostFilters=[];this.contentDomPreFilters=[];this.contentDomPostFilters=[];this.editingAreaStyleSheets=[];this.events=[].concat(this.events);this._keyHandlers={};this.contentPreFilters.push(dojo.hitch(this,"_preFixUrlAttributes"));if(dojo.isMoz){this.contentPreFilters.push(this._normalizeFontStyle);this.contentPostFilters.push(this._removeMozBogus);}if(dojo.isWebKit){this.contentPreFilters.push(this._removeWebkitBogus);this.contentPostFilters.push(this._removeWebkitBogus);}if(dojo.isIE){this.contentPostFilters.push(this._normalizeFontStyle);}this.onLoadDeferred=new dojo.Deferred();},inheritWidth:false,focusOnLoad:false,name:"",styleSheets:"",_content:"",height:"300px",minHeight:"1em",isClosed:true,isLoaded:false,_SEPARATOR:"@@**%%__RICHTEXTBOUNDRY__%%**@@",onLoadDeferred:null,isTabIndent:false,disableSpellCheck:false,postCreate:function(){if("textarea"==this.domNode.tagName.toLowerCase()){console.warn("RichText should not be used with the TEXTAREA tag.  See dijit._editor.RichText docs.");}dojo.publish(dijit._scopeName+"._editor.RichText::init",[this]);this.open();this.setupDefaultShortcuts();},setupDefaultShortcuts:function(){var exec=dojo.hitch(this,function(cmd,arg){return function(){return !this.execCommand(cmd,arg);};});var _17d={b:exec("bold"),i:exec("italic"),u:exec("underline"),a:exec("selectall"),s:function(){this.save(true);},m:function(){this.isTabIndent=!this.isTabIndent;},"1":exec("formatblock","h1"),"2":exec("formatblock","h2"),"3":exec("formatblock","h3"),"4":exec("formatblock","h4"),"\\":exec("insertunorderedlist")};if(!dojo.isIE){_17d.Z=exec("redo");}for(var key in _17d){this.addKeyHandler(key,true,false,_17d[key]);}},events:["onKeyPress","onKeyDown","onKeyUp","onClick"],captureEvents:[],_editorCommandsLocalized:false,_localizeEditorCommands:function(){if(this._editorCommandsLocalized){return;}this._editorCommandsLocalized=true;var _17e=["div","p","pre","h1","h2","h3","h4","h5","h6","ol","ul","address"];var _17f="",_180,i=0;while((_180=_17e[i++])){if(_180.charAt(1)!="l"){_17f+="<"+_180+"><span>content</span></"+_180+"><br/>";}else{_17f+="<"+_180+"><li>content</li></"+_180+"><br/>";}}var div=dojo.doc.createElement("div");dojo.style(div,{position:"absolute",top:"-2000px"});dojo.doc.body.appendChild(div);div.innerHTML=_17f;var node=div.firstChild;while(node){dijit._editor.selection.selectElement(node.firstChild);dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[node.firstChild]);var _181=node.tagName.toLowerCase();this._local2NativeFormatNames[_181]=document.queryCommandValue("formatblock");this._native2LocalFormatNames[this._local2NativeFormatNames[_181]]=_181;node=node.nextSibling.nextSibling;}dojo.body().removeChild(div);},open:function(_182){if(!this.onLoadDeferred||this.onLoadDeferred.fired>=0){this.onLoadDeferred=new dojo.Deferred();}if(!this.isClosed){this.close();}dojo.publish(dijit._scopeName+"._editor.RichText::open",[this]);this._content="";if(arguments.length==1&&_182.nodeName){this.domNode=_182;}var dn=this.domNode;var html;if(dn.nodeName&&dn.nodeName.toLowerCase()=="textarea"){var ta=(this.textarea=dn);this.name=ta.name;html=ta.value;dn=this.domNode=dojo.doc.createElement("div");dn.setAttribute("widgetId",this.id);ta.removeAttribute("widgetId");dn.cssText=ta.cssText;dn.className+=" "+ta.className;dojo.place(dn,ta,"before");var _183=dojo.hitch(this,function(){dojo.style(ta,{display:"block",position:"absolute",top:"-1000px"});if(dojo.isIE){var s=ta.style;this.__overflow=s.overflow;s.overflow="hidden";}});if(dojo.isIE){setTimeout(_183,10);}else{_183();}if(ta.form){dojo.connect(ta.form,"onsubmit",this,function(){ta.value=this.getValue();});}}else{html=dijit._editor.getChildrenHtml(dn);dn.innerHTML="";}var _184=dojo.contentBox(dn);this._oldHeight=_184.h;this._oldWidth=_184.w;this.savedContent=html;if(dn.nodeName&&dn.nodeName=="LI"){dn.innerHTML=" <br>";}this.editingArea=dn.ownerDocument.createElement("div");dn.appendChild(this.editingArea);if(this.name!==""&&(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"])){var _185=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");if(_185.value!==""){var _186=_185.value.split(this._SEPARATOR),i=0,dat;while((dat=_186[i++])){var data=dat.split(":");if(data[0]==this.name){html=data[1];_186.splice(i,1);break;}}}dojo.addOnUnload(dojo.hitch(this,"_saveContent"));}this.isClosed=false;var ifr=(this.editorObject=this.iframe=dojo.doc.createElement("iframe"));ifr.id=this.id+"_iframe";this._iframeSrc=this._getIframeDocTxt();ifr.style.border="none";ifr.style.width="100%";if(this._layoutMode){ifr.style.height="100%";}else{if(dojo.isIE>=7){if(this.height){ifr.style.height=this.height;}if(this.minHeight){ifr.style.minHeight=this.minHeight;}}else{ifr.style.height=this.height?this.height:this.minHeight;}}ifr.frameBorder=0;ifr._loadFunc=dojo.hitch(this,function(win){this.window=win;this.document=this.window.document;if(dojo.isIE){this._localizeEditorCommands();}this.onLoad(html);this.savedContent=this.getValue(true);});var s="javascript:parent."+dijit._scopeName+".byId(\""+this.id+"\")._iframeSrc";ifr.setAttribute("src",s);this.editingArea.appendChild(ifr);if(dojo.isSafari){setTimeout(function(){ifr.setAttribute("src",s);},0);}if(dn.nodeName=="LI"){dn.lastChild.style.marginTop="-1.2em";}dojo.addClass(this.domNode,"RichTextEditable");},_local2NativeFormatNames:{},_native2LocalFormatNames:{},_getIframeDocTxt:function(){var _187=dojo.getComputedStyle(this.domNode);var html="";if(dojo.isIE||(!this.height&&!dojo.isMoz)){html="<div></div>";}else{if(dojo.isMoz){this._cursorToStart=true;html="&nbsp;";}}var font=[_187.fontWeight,_187.fontSize,_187.fontFamily].join(" ");var _188=_187.lineHeight;if(_188.indexOf("px")>=0){_188=parseFloat(_188)/parseFloat(_187.fontSize);}else{if(_188.indexOf("em")>=0){_188=parseFloat(_188);}else{_188="normal";}}var _189="";this.style.replace(/(^|;)(line-|font-?)[^;]+/g,function(_18a){_189+=_18a.replace(/^;/g,"")+";";});var _18b=dojo.query("label[for=\""+this.id+"\"]");return [this.isLeftToRight()?"<html><head>":"<html dir='rtl'><head>",(dojo.isMoz&&_18b.length?"<title>"+_18b[0].innerHTML+"</title>":""),"<meta http-equiv='Content-Type' content='text/html'>","<style>","body,html {","\tbackground:transparent;","\tpadding: 1px 0 0 0;","\tmargin: -1px 0 0 0;",(dojo.isWebKit?"\twidth: 100%;":""),(dojo.isWebKit?"\theight: 100%;":""),"}","body{","\ttop:0px; left:0px; right:0px;","\tfont:",font,";",((this.height||dojo.isOpera)?"":"position: fixed;"),"\tmin-height:",this.minHeight,";","\tline-height:",_188,"}","p{ margin: 1em 0; }",(this.height?"":"body,html{overflow-y:hidden;/*for IE*/} body > div {overflow-x:auto;/*FF:horizontal scrollbar*/ overflow-y:hidden;/*safari*/ min-height:"+this.minHeight+";/*safari*/}"),"li > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; } ","li{ min-height:1.2em; }","</style>",this._applyEditingAreaStyleSheets(),"</head><body onload='frameElement._loadFunc(window,document)' style='"+_189+"'>",html,"</body></html>"].join("");},_applyEditingAreaStyleSheets:function(){var _18c=[];if(this.styleSheets){_18c=this.styleSheets.split(";");this.styleSheets="";}_18c=_18c.concat(this.editingAreaStyleSheets);this.editingAreaStyleSheets=[];var text="",i=0,url;while((url=_18c[i++])){var _18d=(new dojo._Url(dojo.global.location,url)).toString();this.editingAreaStyleSheets.push(_18d);text+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+_18d+"\"/>";}return text;},addStyleSheet:function(uri){var url=uri.toString();if(url.charAt(0)=="."||(url.charAt(0)!="/"&&!uri.host)){url=(new dojo._Url(dojo.global.location,url)).toString();}if(dojo.indexOf(this.editingAreaStyleSheets,url)>-1){return;}this.editingAreaStyleSheets.push(url);this.onLoadDeferred.addCallback(dojo.hitch(function(){if(this.document.createStyleSheet){this.document.createStyleSheet(url);}else{var head=this.document.getElementsByTagName("head")[0];var _18e=this.document.createElement("link");_18e.rel="stylesheet";_18e.type="text/css";_18e.href=url;head.appendChild(_18e);}}));},removeStyleSheet:function(uri){var url=uri.toString();if(url.charAt(0)=="."||(url.charAt(0)!="/"&&!uri.host)){url=(new dojo._Url(dojo.global.location,url)).toString();}var _18f=dojo.indexOf(this.editingAreaStyleSheets,url);if(_18f==-1){return;}delete this.editingAreaStyleSheets[_18f];dojo.withGlobal(this.window,"query",dojo,["link:[href=\""+url+"\"]"]).orphan();},disabled:false,_mozSettingProps:{"styleWithCSS":false},_setDisabledAttr:function(_190){this.disabled=_190;if(!this.isLoaded){return;}_190=!!_190;if(dojo.isIE||dojo.isWebKit||dojo.isOpera){var _191=dojo.isIE&&(this.isLoaded||!this.focusOnLoad);if(_191){this.editNode.unselectable="on";}this.editNode.contentEditable=!_190;if(_191){var _192=this;setTimeout(function(){_192.editNode.unselectable="off";},0);}}else{try{this.document.designMode=(_190?"off":"on");}catch(e){return;}if(!_190&&this._mozSettingProps){var ps=this._mozSettingProps;for(var n in ps){if(ps.hasOwnProperty(n)){try{this.document.execCommand(n,false,ps[n]);}catch(e2){}}}}}this._disabledOK=true;},onLoad:function(html){if(!this.window.__registeredWindow){this.window.__registeredWindow=true;this._iframeRegHandle=dijit.registerIframe(this.iframe);}if(!dojo.isIE&&(this.height||dojo.isMoz)){this.editNode=this.document.body;}else{this.editNode=this.document.body.firstChild;var _193=this;if(dojo.isIE){var _194=(this.tabStop=dojo.doc.createElement("<div tabIndex=-1>"));this.editingArea.appendChild(_194);this.iframe.onfocus=function(){_193.editNode.setActive();};}}this.focusNode=this.editNode;var _195=this.events.concat(this.captureEvents);var ap=this.iframe?this.document:this.editNode;dojo.forEach(_195,function(item){this.connect(ap,item.toLowerCase(),item);},this);if(dojo.isIE){this.connect(this.document,"onmousedown","_onIEMouseDown");this.editNode.style.zoom=1;}if(dojo.isWebKit){this._webkitListener=this.connect(this.document,"onmouseup","onDisplayChanged");}if(dojo.isIE){try{this.document.execCommand("RespectVisibilityInDesign",true,null);}catch(e){}}this.isLoaded=true;this.attr("disabled",this.disabled);this.setValue(html);if(this.onLoadDeferred){this.onLoadDeferred.callback(true);}this.onDisplayChanged();if(this.focusOnLoad){dojo.addOnLoad(dojo.hitch(this,function(){setTimeout(dojo.hitch(this,"focus"),this.updateInterval);}));}},onKeyDown:function(e){if(e.keyCode===dojo.keys.TAB&&this.isTabIndent){dojo.stopEvent(e);if(this.queryCommandEnabled((e.shiftKey?"outdent":"indent"))){this.execCommand((e.shiftKey?"outdent":"indent"));}}if(dojo.isIE){if(e.keyCode==dojo.keys.TAB&&!this.isTabIndent){if(e.shiftKey&&!e.ctrlKey&&!e.altKey){this.iframe.focus();}else{if(!e.shiftKey&&!e.ctrlKey&&!e.altKey){this.tabStop.focus();}}}else{if(e.keyCode===dojo.keys.BACKSPACE&&this.document.selection.type==="Control"){dojo.stopEvent(e);this.execCommand("delete");}else{if((65<=e.keyCode&&e.keyCode<=90)||(e.keyCode>=37&&e.keyCode<=40)){e.charCode=e.keyCode;this.onKeyPress(e);}}}}return true;},onKeyUp:function(e){return;},setDisabled:function(_196){dojo.deprecated("dijit.Editor::setDisabled is deprecated","use dijit.Editor::attr(\"disabled\",boolean) instead",2);this.attr("disabled",_196);},_setValueAttr:function(_197){this.setValue(_197);},_setDisableSpellCheckAttr:function(_198){if(this.document){dojo.attr(this.document.body,"spellcheck",!_198);}else{this.onLoadDeferred.addCallback(dojo.hitch(this,function(){dojo.attr(this.document.body,"spellcheck",!_198);}));}this.disableSpellCheck=_198;},onKeyPress:function(e){var c=(e.keyChar&&e.keyChar.toLowerCase())||e.keyCode,_199=this._keyHandlers[c],args=arguments;if(_199&&!e.altKey){dojo.some(_199,function(h){if(!(h.shift^e.shiftKey)&&!(h.ctrl^e.ctrlKey)){if(!h.handler.apply(this,args)){e.preventDefault();}return true;}},this);}if(!this._onKeyHitch){this._onKeyHitch=dojo.hitch(this,"onKeyPressed");}setTimeout(this._onKeyHitch,1);return true;},addKeyHandler:function(key,ctrl,_19a,_19b){if(!dojo.isArray(this._keyHandlers[key])){this._keyHandlers[key]=[];}this._keyHandlers[key].push({shift:_19a||false,ctrl:ctrl||false,handler:_19b});},onKeyPressed:function(){this.onDisplayChanged();},onClick:function(e){this.onDisplayChanged(e);},_onIEMouseDown:function(e){if(!this._focused&&!this.disabled){this.focus();}},_onBlur:function(e){this.inherited(arguments);var _19c=this.getValue(true);if(_19c!=this.savedContent){this.onChange(_19c);this.savedContent=_19c;}},_onFocus:function(e){if(!this.disabled){if(!this._disabledOK){this.attr("disabled",false);}this.inherited(arguments);}},blur:function(){if(!dojo.isIE&&this.window.document.documentElement&&this.window.document.documentElement.focus){this.window.document.documentElement.focus();}else{if(dojo.doc.body.focus){dojo.doc.body.focus();}}},focus:function(){if(!dojo.isIE){dijit.focus(this.iframe);if(this._cursorToStart){delete this._cursorToStart;if(this.editNode.childNodes&&this.editNode.childNodes.length===1&&this.editNode.innerHTML==="&nbsp;"){this.placeCursorAtStart();}}}else{if(this.editNode&&this.editNode.focus){this.iframe.fireEvent("onfocus",document.createEventObject());}}},updateInterval:200,_updateTimer:null,onDisplayChanged:function(e){if(this._updateTimer){clearTimeout(this._updateTimer);}if(!this._updateHandler){this._updateHandler=dojo.hitch(this,"onNormalizedDisplayChanged");}this._updateTimer=setTimeout(this._updateHandler,this.updateInterval);},onNormalizedDisplayChanged:function(){delete this._updateTimer;},onChange:function(_19d){},_normalizeCommand:function(cmd,_19e){var _19f=cmd.toLowerCase();if(_19f=="formatblock"){if(dojo.isSafari&&_19e===undefined){_19f="heading";}}else{if(_19f=="hilitecolor"&&!dojo.isMoz){_19f="backcolor";}}return _19f;},_qcaCache:{},queryCommandAvailable:function(_1a0){var ca=this._qcaCache[_1a0];if(ca!==undefined){return ca;}return (this._qcaCache[_1a0]=this._queryCommandAvailable(_1a0));},_queryCommandAvailable:function(_1a1){var ie=1;var _1a2=1<<1;var _1a3=1<<2;var _1a4=1<<3;var _1a5=1<<4;function _1a6(_1a7){return {ie:Boolean(_1a7&ie),mozilla:Boolean(_1a7&_1a2),webkit:Boolean(_1a7&_1a3),webkit420:Boolean(_1a7&_1a5),opera:Boolean(_1a7&_1a4)};};var _1a8=null;switch(_1a1.toLowerCase()){case "bold":case "italic":case "underline":case "subscript":case "superscript":case "fontname":case "fontsize":case "forecolor":case "hilitecolor":case "justifycenter":case "justifyfull":case "justifyleft":case "justifyright":case "delete":case "selectall":case "toggledir":_1a8=_1a6(_1a2|ie|_1a3|_1a4);break;case "createlink":case "unlink":case "removeformat":case "inserthorizontalrule":case "insertimage":case "insertorderedlist":case "insertunorderedlist":case "indent":case "outdent":case "formatblock":case "inserthtml":case "undo":case "redo":case "strikethrough":case "tabindent":_1a8=_1a6(_1a2|ie|_1a4|_1a5);break;case "blockdirltr":case "blockdirrtl":case "dirltr":case "dirrtl":case "inlinedirltr":case "inlinedirrtl":_1a8=_1a6(ie);break;case "cut":case "copy":case "paste":_1a8=_1a6(ie|_1a2|_1a5);break;case "inserttable":_1a8=_1a6(_1a2|ie);break;case "insertcell":case "insertcol":case "insertrow":case "deletecells":case "deletecols":case "deleterows":case "mergecells":case "splitcell":_1a8=_1a6(ie|_1a2);break;default:return false;}return (dojo.isIE&&_1a8.ie)||(dojo.isMoz&&_1a8.mozilla)||(dojo.isWebKit&&_1a8.webkit)||(dojo.isWebKit>420&&_1a8.webkit420)||(dojo.isOpera&&_1a8.opera);},execCommand:function(_1a9,_1aa){var _1ab;this.focus();_1a9=this._normalizeCommand(_1a9,_1aa);if(_1aa!==undefined){if(_1a9=="heading"){throw new Error("unimplemented");}else{if((_1a9=="formatblock")&&dojo.isIE){_1aa="<"+_1aa+">";}}}var _1ac="_"+_1a9+"Impl";if(this[_1ac]){_1ab=this[_1ac](_1aa);}else{_1aa=arguments.length>1?_1aa:null;if(_1aa||_1a9!="createlink"){_1ab=this.document.execCommand(_1a9,false,_1aa);}}this.onDisplayChanged();return _1ab;},queryCommandEnabled:function(_1ad){if(this.disabled||!this._disabledOK){return false;}_1ad=this._normalizeCommand(_1ad);if(dojo.isMoz||dojo.isWebKit){if(_1ad=="unlink"){return this._sCall("hasAncestorElement",["a"]);}else{if(_1ad=="inserttable"){return true;}}}if(dojo.isWebKit){if(_1ad=="copy"){_1ad="cut";}else{if(_1ad=="paste"){return true;}}}var elem=dojo.isIE?this.document.selection.createRange():this.document;try{return elem.queryCommandEnabled(_1ad);}catch(e){return false;}},queryCommandState:function(_1ae){if(this.disabled||!this._disabledOK){return false;}_1ae=this._normalizeCommand(_1ae);try{return this.document.queryCommandState(_1ae);}catch(e){return false;}},queryCommandValue:function(_1af){if(this.disabled||!this._disabledOK){return false;}var r;_1af=this._normalizeCommand(_1af);if(dojo.isIE&&_1af=="formatblock"){r=this._native2LocalFormatNames[this.document.queryCommandValue(_1af)];}else{if(dojo.isMoz&&_1af==="hilitecolor"){var _1b0;try{_1b0=this.document.queryCommandValue("styleWithCSS");}catch(e){_1b0=false;}this.document.execCommand("styleWithCSS",false,true);r=this.document.queryCommandValue(_1af);this.document.execCommand("styleWithCSS",false,_1b0);}else{r=this.document.queryCommandValue(_1af);}}return r;},_sCall:function(name,args){return dojo.withGlobal(this.window,name,dijit._editor.selection,args);},placeCursorAtStart:function(){this.focus();var _1b1=false;if(dojo.isMoz){var _1b2=this.editNode.firstChild;while(_1b2){if(_1b2.nodeType==3){if(_1b2.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_1b1=true;this._sCall("selectElement",[_1b2]);break;}}else{if(_1b2.nodeType==1){_1b1=true;var tg=_1b2.tagName?_1b2.tagName.toLowerCase():"";if(/br|input|img|base|meta|area|basefont|hr|link/.test(tg)){this._sCall("selectElement",[_1b2]);}else{this._sCall("selectElementChildren",[_1b2]);}break;}}_1b2=_1b2.nextSibling;}}else{_1b1=true;this._sCall("selectElementChildren",[this.editNode]);}if(_1b1){this._sCall("collapse",[true]);}},placeCursorAtEnd:function(){this.focus();var _1b3=false;if(dojo.isMoz){var last=this.editNode.lastChild;while(last){if(last.nodeType==3){if(last.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_1b3=true;this._sCall("selectElement",[last]);break;}}else{if(last.nodeType==1){_1b3=true;if(last.lastChild){this._sCall("selectElement",[last.lastChild]);}else{this._sCall("selectElement",[last]);}break;}}last=last.previousSibling;}}else{_1b3=true;this._sCall("selectElementChildren",[this.editNode]);}if(_1b3){this._sCall("collapse",[false]);}},getValue:function(_1b4){if(this.textarea){if(this.isClosed||!this.isLoaded){return this.textarea.value;}}return this._postFilterContent(null,_1b4);},_getValueAttr:function(){return this.getValue(true);},setValue:function(html){if(!this.isLoaded){this.onLoadDeferred.addCallback(dojo.hitch(this,function(){this.setValue(html);}));return;}if(this.textarea&&(this.isClosed||!this.isLoaded)){this.textarea.value=html;}else{html=this._preFilterContent(html);var node=this.isClosed?this.domNode:this.editNode;if(!html&&dojo.isWebKit){this._cursorToStart=true;html="&nbsp;";}node.innerHTML=html;this._preDomFilterContent(node);}this.onDisplayChanged();},replaceValue:function(html){if(this.isClosed){this.setValue(html);}else{if(this.window&&this.window.getSelection&&!dojo.isMoz){this.setValue(html);}else{if(this.window&&this.window.getSelection){html=this._preFilterContent(html);this.execCommand("selectall");if(!html){this._cursorToStart=true;html="&nbsp;";}this.execCommand("inserthtml",html);this._preDomFilterContent(this.editNode);}else{if(this.document&&this.document.selection){this.setValue(html);}}}}},_preFilterContent:function(html){var ec=html;dojo.forEach(this.contentPreFilters,function(ef){if(ef){ec=ef(ec);}});return ec;},_preDomFilterContent:function(dom){dom=dom||this.editNode;dojo.forEach(this.contentDomPreFilters,function(ef){if(ef&&dojo.isFunction(ef)){ef(dom);}},this);},_postFilterContent:function(dom,_1b5){var ec;if(!dojo.isString(dom)){dom=dom||this.editNode;if(this.contentDomPostFilters.length){if(_1b5){dom=dojo.clone(dom);}dojo.forEach(this.contentDomPostFilters,function(ef){dom=ef(dom);});}ec=dijit._editor.getChildrenHtml(dom);}else{ec=dom;}if(!dojo.trim(ec.replace(/^\xA0\xA0*/,"").replace(/\xA0\xA0*$/,"")).length){ec="";}dojo.forEach(this.contentPostFilters,function(ef){ec=ef(ec);});return ec;},_saveContent:function(e){var _1b6=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");if(_1b6.value){_1b6.value+=this._SEPARATOR;}_1b6.value+=this.name+":"+this.getValue(true);},escapeXml:function(str,_1b7){str=str.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");if(!_1b7){str=str.replace(/'/gm,"&#39;");}return str;},getNodeHtml:function(node){dojo.deprecated("dijit.Editor::getNodeHtml is deprecated","use dijit._editor.getNodeHtml instead",2);return dijit._editor.getNodeHtml(node);},getNodeChildrenHtml:function(dom){dojo.deprecated("dijit.Editor::getNodeChildrenHtml is deprecated","use dijit._editor.getChildrenHtml instead",2);return dijit._editor.getChildrenHtml(dom);},close:function(save){if(this.isClosed){return false;}if(!arguments.length){save=true;}this._content=this.getValue();var _1b8=(this.savedContent!=this._content);if(this.interval){clearInterval(this.interval);}if(this._webkitListener){this.disconnect(this._webkitListener);delete this._webkitListener;}if(dojo.isIE){this.iframe.onfocus=null;}this.iframe._loadFunc=null;if(this._iframeRegHandle){dijit.unregisterIframe(this._iframeRegHandle);delete this._iframeRegHandle;}if(this.textarea){var s=this.textarea.style;s.position="";s.left=s.top="";if(dojo.isIE){s.overflow=this.__overflow;this.__overflow=null;}this.textarea.value=save?this._content:this.savedContent;dojo.destroy(this.domNode);this.domNode=this.textarea;}else{this.domNode.innerHTML=save?this._content:this.savedContent;}delete this.iframe;dojo.removeClass(this.domNode,"RichTextEditable");this.isClosed=true;this.isLoaded=false;delete this.editNode;delete this.focusNode;if(this.window&&this.window._frameElement){this.window._frameElement=null;}this.window=null;this.document=null;this.editingArea=null;this.editorObject=null;return _1b8;},destroy:function(){if(!this.isClosed){this.close(false);}this.inherited(arguments);},_removeMozBogus:function(html){return html.replace(/\stype="_moz"/gi,"").replace(/\s_moz_dirty=""/gi,"").replace(/_moz_resizing="(true|false)"/gi,"");},_removeWebkitBogus:function(html){html=html.replace(/\sclass="webkit-block-placeholder"/gi,"");html=html.replace(/\sclass="apple-style-span"/gi,"");return html;},_normalizeFontStyle:function(html){return html.replace(/<(\/)?strong([ \>])/gi,"<$1b$2").replace(/<(\/)?em([ \>])/gi,"<$1i$2");},_preFixUrlAttributes:function(html){return html.replace(/(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2").replace(/(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2");},_inserthorizontalruleImpl:function(_1b9){if(dojo.isIE){return this._inserthtmlImpl("<hr>");}return this.document.execCommand("inserthorizontalrule",false,_1b9);},_unlinkImpl:function(_1ba){if((this.queryCommandEnabled("unlink"))&&(dojo.isMoz||dojo.isWebKit)){var a=this._sCall("getAncestorElement",["a"]);this._sCall("selectElement",[a]);return this.document.execCommand("unlink",false,null);}return this.document.execCommand("unlink",false,_1ba);},_hilitecolorImpl:function(_1bb){var _1bc;if(dojo.isMoz){this.document.execCommand("styleWithCSS",false,true);_1bc=this.document.execCommand("hilitecolor",false,_1bb);this.document.execCommand("styleWithCSS",false,false);}else{_1bc=this.document.execCommand("hilitecolor",false,_1bb);}return _1bc;},_backcolorImpl:function(_1bd){if(dojo.isIE){_1bd=_1bd?_1bd:null;}return this.document.execCommand("backcolor",false,_1bd);},_forecolorImpl:function(_1be){if(dojo.isIE){_1be=_1be?_1be:null;}return this.document.execCommand("forecolor",false,_1be);},_inserthtmlImpl:function(_1bf){_1bf=this._preFilterContent(_1bf);var rv=true;if(dojo.isIE){var _1c0=this.document.selection.createRange();if(this.document.selection.type.toUpperCase()=="CONTROL"){var n=_1c0.item(0);while(_1c0.length){_1c0.remove(_1c0.item(0));}n.outerHTML=_1bf;}else{_1c0.pasteHTML(_1bf);}_1c0.select();}else{if(dojo.isMoz&&!_1bf.length){this._sCall("remove");}else{rv=this.document.execCommand("inserthtml",false,_1bf);}}return rv;}});}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(_1c1,_1c2){var _1c3=(this._keyNavCodes={});var prev=dojo.hitch(this,this.focusPrev);var next=dojo.hitch(this,this.focusNext);dojo.forEach(_1c1,function(code){_1c3[code]=prev;});dojo.forEach(_1c2,function(code){_1c3[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(_1c4,_1c5){dijit._KeyNavContainer.superclass.addChild.apply(this,arguments);this._startupChild(_1c4);},focus:function(){this.focusFirstChild();},focusFirstChild:function(){var _1c6=this._getFirstFocusableChild();if(_1c6){this.focusChild(_1c6);}},focusNext:function(){var _1c7=this._getNextFocusableChild(this.focusedChild,1);this.focusChild(_1c7);},focusPrev:function(){var _1c8=this._getNextFocusableChild(this.focusedChild,-1);this.focusChild(_1c8,true);},focusChild:function(_1c9,last){if(this.focusedChild&&_1c9!==this.focusedChild){this._onChildBlur(this.focusedChild);}_1c9.focus(last?"end":"start");this.focusedChild=_1c9;},_startupChild:function(_1ca){_1ca.attr("tabIndex","-1");this.connect(_1ca,"_onFocus",function(){_1ca.attr("tabIndex",this.tabIndex);});this.connect(_1ca,"_onBlur",function(){_1ca.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(_1cb){},_getFirstFocusableChild:function(){return this._getNextFocusableChild(null,1);},_getNextFocusableChild:function(_1cc,dir){if(_1cc){_1cc=this._getSiblingOfChild(_1cc,dir);}var _1cd=this.getChildren();for(var i=0;i<_1cd.length;i++){if(!_1cc){_1cc=_1cd[(dir>0)?0:(_1cd.length-1)];}if(_1cc.isFocusable()){return _1cc;}_1cc=this._getSiblingOfChild(_1cc,dir);}return null;}});}if(!dojo._hasResource["dijit.ToolbarSeparator"]){dojo._hasResource["dijit.ToolbarSeparator"]=true;dojo.provide("dijit.ToolbarSeparator");dojo.declare("dijit.ToolbarSeparator",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dijitToolbarSeparator dijitInline\"></div>",postCreate:function(){dojo.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});}if(!dojo._hasResource["dijit.Toolbar"]){dojo._hasResource["dijit.Toolbar"]=true;dojo.provide("dijit.Toolbar");dojo.declare("dijit.Toolbar",[dijit._Widget,dijit._Templated,dijit._KeyNavContainer],{templateString:"<div class=\"dijit dijitToolbar\" waiRole=\"toolbar\" tabIndex=\"${tabIndex}\" dojoAttachPoint=\"containerNode\">"+"</div>",postCreate:function(){this.connectKeyNavHandlers(this.isLeftToRight()?[dojo.keys.LEFT_ARROW]:[dojo.keys.RIGHT_ARROW],this.isLeftToRight()?[dojo.keys.RIGHT_ARROW]:[dojo.keys.LEFT_ARROW]);},startup:function(){if(this._started){return;}this.startupKeyNavChildren();this.inherited(arguments);}});}if(!dojo._hasResource["dijit._HasDropDown"]){dojo._hasResource["dijit._HasDropDown"]=true;dojo.provide("dijit._HasDropDown");dojo.declare("dijit._HasDropDown",null,{_buttonNode:null,_arrowWrapperNode:null,_popupStateNode:null,_aroundNode:null,dropDown:null,autoWidth:true,forceWidth:false,maxHeight:0,dropDownPosition:["below","above"],_stopClickEvents:true,_onDropDownMouse:function(e){if(e.type=="click"&&!this._seenKeydown){return;}this._seenKeydown=false;if(e.type=="mousedown"){this._docHandler=this.connect(dojo.doc,"onmouseup","_onDropDownMouseup");}if(this.disabled||this.readOnly){return;}if(this._stopClickEvents){dojo.stopEvent(e);}this.toggleDropDown();if(e.type=="click"||e.type=="keypress"){this._onDropDownMouseup();}},_onDropDownMouseup:function(e){if(e&&this._docHandler){this.disconnect(this._docHandler);}var _1ce=this.dropDown,_1cf=false;if(e&&this._opened){var c=dojo.position(this._buttonNode,true);if(!(e.pageX>=c.x&&e.pageX<=c.x+c.w)||!(e.pageY>=c.y&&e.pageY<=c.y+c.h)){var t=e.target;while(t&&!_1cf){if(dojo.hasClass(t,"dijitPopup")){_1cf=true;}else{t=t.parentNode;}}if(_1cf){t=e.target;if(_1ce.onItemClick){var _1d0;while(t&&!(_1d0=dijit.byNode(t))){t=t.parentNode;}if(_1d0&&_1d0.onClick&&_1d0.getParent){_1d0.getParent().onItemClick(_1d0,e);}}return;}}}if(this._opened&&_1ce.focus){window.setTimeout(dojo.hitch(_1ce,"focus"),1);}},_setupDropdown:function(){this._buttonNode=this._buttonNode||this.focusNode||this.domNode;this._popupStateNode=this._popupStateNode||this.focusNode||this._buttonNode;this._aroundNode=this._aroundNode||this.domNode;this.connect(this._buttonNode,"onmousedown","_onDropDownMouse");this.connect(this._buttonNode,"onclick","_onDropDownMouse");this.connect(this._buttonNode,"onkeydown","_onDropDownKeydown");this.connect(this._buttonNode,"onblur","_onDropDownBlur");this.connect(this._buttonNode,"onkeypress","_onKey");if(this._setStateClass){this.connect(this,"openDropDown","_setStateClass");this.connect(this,"closeDropDown","_setStateClass");}var _1d1={"after":this.isLeftToRight()?"Right":"Left","before":this.isLeftToRight()?"Left":"Right","above":"Up","below":"Down","left":"Left","right":"Right"}[this.dropDownPosition[0]]||this.dropDownPosition[0]||"Down";dojo.addClass(this._arrowWrapperNode||this._buttonNode,"dijit"+_1d1+"ArrowButton");},postCreate:function(){this._setupDropdown();this.inherited(arguments);},destroyDescendants:function(){if(this.dropDown){if(!this.dropDown._destroyed){this.dropDown.destroyRecursive();}delete this.dropDown;}this.inherited(arguments);},_onDropDownKeydown:function(e){this._seenKeydown=true;},_onKeyPress:function(e){if(this._opened&&e.charOrCode==dojo.keys.ESCAPE&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){this.toggleDropDown();dojo.stopEvent(e);return;}this.inherited(arguments);},_onDropDownBlur:function(e){this._seenKeydown=false;},_onKey:function(e){if(this.disabled||this.readOnly){return;}var d=this.dropDown;if(d&&this._opened&&d.handleKey){if(d.handleKey(e)===false){return;}}if(d&&this._opened&&e.keyCode==dojo.keys.ESCAPE){this.toggleDropDown();return;}if(e.keyCode==dojo.keys.DOWN_ARROW||e.keyCode==dojo.keys.ENTER||e.charOrCode==" "){this._onDropDownMouse(e);}},_onBlur:function(){this.closeDropDown();this.inherited(arguments);},isLoaded:function(){return true;},loadDropDown:function(_1d2){_1d2();},toggleDropDown:function(){if(this.disabled||this.readOnly){return;}this.focus();var _1d3=this.dropDown;if(!_1d3){return;}if(!this._opened){if(!this.isLoaded()){this.loadDropDown(dojo.hitch(this,"openDropDown"));return;}else{this.openDropDown();}}else{this.closeDropDown();}},openDropDown:function(){var _1d4=this.dropDown;var _1d5=_1d4.domNode;var self=this;if(!this._preparedNode){dijit.popup.moveOffScreen(_1d5);this._preparedNode=true;if(_1d5.style.width){this._explicitDDWidth=true;}if(_1d5.style.height){this._explicitDDHeight=true;}}if(this.maxHeight||this.forceWidth||this.autoWidth){var _1d6={display:"",visibility:"hidden"};if(!this._explicitDDWidth){_1d6.width="";}if(!this._explicitDDHeight){_1d6.height="";}dojo.style(_1d5,_1d6);var mb=dojo.marginBox(_1d5);var _1d7=(this.maxHeight&&mb.h>this.maxHeight);dojo.style(_1d5,{overflow:_1d7?"auto":"hidden"});if(this.forceWidth){mb.w=this.domNode.offsetWidth;}else{if(this.autoWidth){mb.w=Math.max(mb.w,this.domNode.offsetWidth);}else{delete mb.w;}}if(_1d7){mb.h=this.maxHeight;if("w" in mb){mb.w+=16;}}else{delete mb.h;}delete mb.t;delete mb.l;if(dojo.isFunction(_1d4.resize)){_1d4.resize(mb);}else{dojo.marginBox(_1d5,mb);}}var _1d8=dijit.popup.open({parent:this,popup:_1d4,around:this._aroundNode,orient:dijit.getPopupAroundAlignment((this.dropDownPosition&&this.dropDownPosition.length)?this.dropDownPosition:["below"],this.isLeftToRight()),onExecute:function(){self.closeDropDown(true);},onCancel:function(){self.closeDropDown(true);},onClose:function(){dojo.attr(self._popupStateNode,"popupActive",false);dojo.removeClass(self._popupStateNode,"dijitHasDropDownOpen");self._opened=false;self.state="";}});dojo.attr(this._popupStateNode,"popupActive","true");dojo.addClass(self._popupStateNode,"dijitHasDropDownOpen");this._opened=true;this.state="Opened";return _1d8;},closeDropDown:function(_1d9){if(this._opened){dijit.popup.close(this.dropDown);if(_1d9){this.focus();}this._opened=false;this.state="";}}});}if(!dojo._hasResource["dijit.form.Button"]){dojo._hasResource["dijit.form.Button"]=true;dojo.provide("dijit.form.Button");dojo.declare("dijit.form.Button",dijit.form._FormWidget,{label:"",showLabel:true,iconClass:"",type:"button",baseClass:"dijitButton",templateString:dojo.cache("dijit.form","templates/Button.html","<span class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\t><span class=\"dijitReset dijitRight dijitInline\"\n\t\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\t\t><button class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\t\tdojoAttachPoint=\"titleNode,focusNode\"\n\t\t\t\t${nameAttrSetting} type=\"${type}\" value=\"${value}\" waiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t\t><span class=\"dijitReset dijitInline\" dojoAttachPoint=\"iconNode\"\n\t\t\t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">&#10003;</span\n\t\t\t\t></span\n\t\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\t\tid=\"${id}_label\"\n\t\t\t\t\tdojoAttachPoint=\"containerNode\"\n\t\t\t\t></span\n\t\t\t></button\n\t\t></span\n\t></span\n></span>\n"),attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{label:{node:"containerNode",type:"innerHTML"},iconClass:{node:"iconNode",type:"class"}}),_onClick:function(e){if(this.disabled){return false;}this._clicked();return this.onClick(e);},_onButtonClick:function(e){if(this._onClick(e)===false){e.preventDefault();}else{if(this.type=="submit"&&!this.focusNode.form){for(var node=this.domNode;node.parentNode;node=node.parentNode){var _1da=dijit.byNode(node);if(_1da&&typeof _1da._onSubmit=="function"){_1da._onSubmit(e);break;}}}}},_setValueAttr:function(_1db){var attr=this.attributeMap.value||"";if(this[attr.node||attr||"domNode"].tagName=="BUTTON"){if(_1db!=this.value){}}},_fillContent:function(_1dc){if(_1dc&&(!this.params||!("label" in this.params))){this.attr("label",_1dc.innerHTML);}},postCreate:function(){dojo.setSelectable(this.focusNode,false);this.inherited(arguments);},_setShowLabelAttr:function(val){if(this.containerNode){dojo.toggleClass(this.containerNode,"dijitDisplayNone",!val);}this.showLabel=val;},onClick:function(e){return true;},_clicked:function(e){},setLabel:function(_1dd){dojo.deprecated("dijit.form.Button.setLabel() is deprecated.  Use attr('label', ...) instead.","","2.0");this.attr("label",_1dd);},_setLabelAttr:function(_1de){this.containerNode.innerHTML=this.label=_1de;if(this.showLabel==false&&!this.params.title){this.titleNode.title=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");}}});dojo.declare("dijit.form.DropDownButton",[dijit.form.Button,dijit._Container,dijit._HasDropDown],{baseClass:"dijitDropDownButton",templateString:dojo.cache("dijit.form","templates/DropDownButton.html","<span class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachPoint=\"_buttonNode\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\t><span class='dijitReset dijitRight dijitInline'\n\t\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\t\t><button class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\t\t${nameAttrSetting} type=\"${type}\" value=\"${value}\"\n\t\t\t\tdojoAttachPoint=\"focusNode,titleNode,_arrowWrapperNode\"\n\t\t\t\twaiRole=\"button\" waiState=\"haspopup-true,labelledby-${id}_label\"\n\t\t\t\t><span class=\"dijitReset dijitInline\"\n\t\t\t\t\tdojoAttachPoint=\"iconNode\"\n\t\t\t\t></span\n\t\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\t\tdojoAttachPoint=\"containerNode,_popupStateNode\"\n\t\t\t\t\tid=\"${id}_label\"\n\t\t\t\t></span\n\t\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonInner\">&thinsp;</span\n\t\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonChar\">&#9660;</span\n\t\t\t></button\n\t\t></span\n\t></span\n></span>\n"),_fillContent:function(){if(this.srcNodeRef){var _1df=dojo.query("*",this.srcNodeRef);dijit.form.DropDownButton.superclass._fillContent.call(this,_1df[0]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown){var _1e0=dojo.query("[widgetId]",this.dropDownContainer)[0];this.dropDown=dijit.byNode(_1e0);delete this.dropDownContainer;}dijit.popup.moveOffScreen(this.dropDown.domNode);this.inherited(arguments);},isLoaded:function(){var _1e1=this.dropDown;return (!_1e1.href||_1e1.isLoaded);},loadDropDown:function(){var _1e2=this.dropDown;if(!_1e2){return;}if(!this.isLoaded()){var _1e3=dojo.connect(_1e2,"onLoad",this,function(){dojo.disconnect(_1e3);this.openDropDown();});_1e2.refresh();}else{this.openDropDown();}},isFocusable:function(){return this.inherited(arguments)&&!this._mouseDown;}});dojo.declare("dijit.form.ComboButton",dijit.form.DropDownButton,{templateString:dojo.cache("dijit.form","templates/ComboButton.html","<table class='dijit dijitReset dijitInline dijitLeft'\n\tcellspacing='0' cellpadding='0' waiRole=\"presentation\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonNode\"><button id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onkeypress:_onButtonKeyPress\"  dojoAttachPoint=\"titleNode\"\n\t\t\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"presentation\"></div\n\t\t></button></td\n\t\t><td id=\"${id}_arrow\" class='dijitReset dijitRight dijitButtonNode dijitArrowButton'\n\t\t\tdojoAttachPoint=\"_popupStateNode,focusNode,_buttonNode\"\n\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onkeypress:_onArrowKeyPress\"\n\t\t\tstateModifier=\"DownArrow\"\n\t\t\ttitle=\"${optionsTitle}\" ${nameAttrSetting}\n\t\t\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"presentation\">&#9660;</div\n\t\t></td\n\t></tr></tbody\n></table>\n"),attributeMap:dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),{id:"",tabIndex:["focusNode","titleNode"],title:"titleNode"}),optionsTitle:"",baseClass:"dijitComboButton",_focusedNode:null,postCreate:function(){this.inherited(arguments);this._focalNodes=[this.titleNode,this._popupStateNode];var isIE=dojo.isIE;dojo.forEach(this._focalNodes,dojo.hitch(this,function(node){this.connect(node,isIE?"onactivate":"onfocus",this._onNodeFocus);this.connect(node,isIE?"ondeactivate":"onblur",this._onNodeBlur);}));if(isIE&&(isIE<8||dojo.isQuirks)){with(this.titleNode){style.width=scrollWidth+"px";this.connect(this.titleNode,"onresize",function(){setTimeout(function(){style.width=scrollWidth+"px";},0);});}}},_onNodeFocus:function(evt){this._focusedNode=evt.currentTarget;var fnc=this._focusedNode==this.focusNode?"dijitDownArrowButtonFocused":"dijitButtonContentsFocused";dojo.addClass(this._focusedNode,fnc);},_onNodeBlur:function(evt){var fnc=evt.currentTarget==this.focusNode?"dijitDownArrowButtonFocused":"dijitButtonContentsFocused";dojo.removeClass(evt.currentTarget,fnc);},_onBlur:function(){this.inherited(arguments);this._focusedNode=null;},_onButtonKeyPress:function(evt){if(evt.charOrCode==dojo.keys[this.isLeftToRight()?"RIGHT_ARROW":"LEFT_ARROW"]){dijit.focus(this._popupStateNode);dojo.stopEvent(evt);}},_onArrowKeyPress:function(evt){if(evt.charOrCode==dojo.keys[this.isLeftToRight()?"LEFT_ARROW":"RIGHT_ARROW"]){dijit.focus(this.titleNode);dojo.stopEvent(evt);}},focus:function(_1e4){dijit.focus(_1e4=="start"?this.titleNode:this._popupStateNode);}});dojo.declare("dijit.form.ToggleButton",dijit.form.Button,{baseClass:"dijitToggleButton",checked:false,attributeMap:dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),{checked:"focusNode"}),_clicked:function(evt){this.attr("checked",!this.checked);},_setCheckedAttr:function(_1e5){this.checked=_1e5;dojo.attr(this.focusNode||this.domNode,"checked",_1e5);dijit.setWaiState(this.focusNode||this.domNode,"pressed",_1e5);this._setStateClass();this._handleOnChange(_1e5,true);},setChecked:function(_1e6){dojo.deprecated("setChecked("+_1e6+") is deprecated. Use attr('checked',"+_1e6+") instead.","","2.0");this.attr("checked",_1e6);},reset:function(){this._hasBeenBlurred=false;this.attr("checked",this.params.checked||false);}});}if(!dojo._hasResource["dijit._editor._Plugin"]){dojo._hasResource["dijit._editor._Plugin"]=true;dojo.provide("dijit._editor._Plugin");dojo.declare("dijit._editor._Plugin",null,{constructor:function(args,node){this.params=args||{};dojo.mixin(this,this.params);this._connects=[];},editor:null,iconClassPrefix:"dijitEditorIcon",button:null,command:"",useDefaultCommand:true,buttonClass:dijit.form.Button,getLabel:function(key){return this.editor.commands[key];},_initButton:function(){if(this.command.length){var _1e7=this.getLabel(this.command);var _1e8=this.iconClassPrefix+" "+this.iconClassPrefix+this.command.charAt(0).toUpperCase()+this.command.substr(1);if(!this.button){var _1e9=dojo.mixin({label:_1e7,showLabel:false,iconClass:_1e8,dropDown:this.dropDown,tabIndex:"-1"},this.params||{});this.button=new this.buttonClass(_1e9);}}},destroy:function(){dojo.forEach(this._connects,dojo.disconnect);if(this.dropDown){this.dropDown.destroyRecursive();}},connect:function(o,f,tf){this._connects.push(dojo.connect(o,f,this,tf));},updateState:function(){var e=this.editor,c=this.command,_1ea,_1eb;if(!e||!e.isLoaded||!c.length){return;}if(this.button){try{_1eb=e.queryCommandEnabled(c);if(this.enabled!==_1eb){this.enabled=_1eb;this.button.attr("disabled",!_1eb);}if(typeof this.button.checked=="boolean"){_1ea=e.queryCommandState(c);if(this.checked!==_1ea){this.checked=_1ea;this.button.attr("checked",e.queryCommandState(c));}}}catch(e){}}},setEditor:function(_1ec){this.editor=_1ec;this._initButton();if(this.command.length&&!this.editor.queryCommandAvailable(this.command)){if(this.button){this.button.domNode.style.display="none";}}if(this.button&&this.useDefaultCommand){this.connect(this.button,"onClick",dojo.hitch(this.editor,"execCommand",this.command,this.commandArg));}this.connect(this.editor,"onNormalizedDisplayChanged","updateState");},setToolbar:function(_1ed){if(this.button){_1ed.addChild(this.button);}}});}if(!dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]){dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]=true;dojo.provide("dijit._editor.plugins.EnterKeyHandling");dojo.declare("dijit._editor.plugins.EnterKeyHandling",dijit._editor._Plugin,{blockNodeForEnter:"BR",constructor:function(args){if(args){dojo.mixin(this,args);}},setEditor:function(_1ee){this.editor=_1ee;if(this.blockNodeForEnter=="BR"){if(dojo.isIE){_1ee.contentDomPreFilters.push(dojo.hitch(this,"regularPsToSingleLinePs"));_1ee.contentDomPostFilters.push(dojo.hitch(this,"singleLinePsToRegularPs"));_1ee.onLoadDeferred.addCallback(dojo.hitch(this,"_fixNewLineBehaviorForIE"));}else{_1ee.onLoadDeferred.addCallback(dojo.hitch(this,function(d){try{this.editor.document.execCommand("insertBrOnReturn",false,true);}catch(e){}return d;}));}}else{if(this.blockNodeForEnter){dojo["require"]("dijit._editor.range");var h=dojo.hitch(this,this.handleEnterKey);_1ee.addKeyHandler(13,0,0,h);_1ee.addKeyHandler(13,0,1,h);this.connect(this.editor,"onKeyPressed","onKeyPressed");}}},onKeyPressed:function(e){if(this._checkListLater){if(dojo.withGlobal(this.editor.window,"isCollapsed",dijit)){var _1ef=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,["LI"]);if(!_1ef){dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);var _1f0=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]);if(_1f0){_1f0.innerHTML=this.bogusHtmlContent;if(dojo.isIE){var r=this.editor.document.selection.createRange();r.move("character",-1);r.select();}}else{console.error("onKeyPressed: Cannot find the new block node");}}else{if(dojo.isMoz){if(_1ef.parentNode.parentNode.nodeName=="LI"){_1ef=_1ef.parentNode.parentNode;}}var fc=_1ef.firstChild;if(fc&&fc.nodeType==1&&(fc.nodeName=="UL"||fc.nodeName=="OL")){_1ef.insertBefore(fc.ownerDocument.createTextNode(" "),fc);var _1f1=dijit.range.create(this.editor.window);_1f1.setStart(_1ef.firstChild,0);var _1f2=dijit.range.getSelection(this.editor.window,true);_1f2.removeAllRanges();_1f2.addRange(_1f1);}}}this._checkListLater=false;}if(this._pressedEnterInBlock){if(this._pressedEnterInBlock.previousSibling){this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);}delete this._pressedEnterInBlock;}},bogusHtmlContent:"&nbsp;",blockNodes:/^(?:P|H1|H2|H3|H4|H5|H6|LI)$/,handleEnterKey:function(e){var _1f3,_1f4,_1f5,doc=this.editor.document,br;if(e.shiftKey){var _1f6=dojo.withGlobal(this.editor.window,"getParentElement",dijit._editor.selection);var _1f7=dijit.range.getAncestor(_1f6,this.blockNodes);if(_1f7){if(!e.shiftKey&&_1f7.tagName=="LI"){return true;}_1f3=dijit.range.getSelection(this.editor.window);_1f4=_1f3.getRangeAt(0);if(!_1f4.collapsed){_1f4.deleteContents();_1f3=dijit.range.getSelection(this.editor.window);_1f4=_1f3.getRangeAt(0);}if(dijit.range.atBeginningOfContainer(_1f7,_1f4.startContainer,_1f4.startOffset)){if(e.shiftKey){br=doc.createElement("br");_1f5=dijit.range.create(this.editor.window);_1f7.insertBefore(br,_1f7.firstChild);_1f5.setStartBefore(br.nextSibling);_1f3.removeAllRanges();_1f3.addRange(_1f5);}else{dojo.place(br,_1f7,"before");}}else{if(dijit.range.atEndOfContainer(_1f7,_1f4.startContainer,_1f4.startOffset)){_1f5=dijit.range.create(this.editor.window);br=doc.createElement("br");if(e.shiftKey){_1f7.appendChild(br);_1f7.appendChild(doc.createTextNode(" "));_1f5.setStart(_1f7.lastChild,0);}else{dojo.place(br,_1f7,"after");_1f5.setStartAfter(_1f7);}_1f3.removeAllRanges();_1f3.addRange(_1f5);}else{return true;}}}else{dijit._editor.RichText.prototype.execCommand.call(this.editor,"inserthtml","<br>");}return false;}var _1f8=true;_1f3=dijit.range.getSelection(this.editor.window);_1f4=_1f3.getRangeAt(0);if(!_1f4.collapsed){_1f4.deleteContents();_1f3=dijit.range.getSelection(this.editor.window);_1f4=_1f3.getRangeAt(0);}var _1f9=dijit.range.getBlockAncestor(_1f4.endContainer,null,this.editor.editNode);var _1fa=_1f9.blockNode;if((this._checkListLater=(_1fa&&(_1fa.nodeName=="LI"||_1fa.parentNode.nodeName=="LI")))){if(dojo.isMoz){this._pressedEnterInBlock=_1fa;}if(/^(\s|&nbsp;|\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s|&nbsp;|\xA0)<\/span>)?(<br>)?$/.test(_1fa.innerHTML)){_1fa.innerHTML="";if(dojo.isWebKit){_1f5=dijit.range.create(this.editor.window);_1f5.setStart(_1fa,0);_1f3.removeAllRanges();_1f3.addRange(_1f5);}this._checkListLater=false;}return true;}if(!_1f9.blockNode||_1f9.blockNode===this.editor.editNode){try{dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);}catch(e2){}_1f9={blockNode:dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]),blockContainer:this.editor.editNode};if(_1f9.blockNode){if(_1f9.blockNode!=this.editor.editNode&&(!(_1f9.blockNode.textContent||_1f9.blockNode.innerHTML).replace(/^\s+|\s+$/g,"").length)){this.removeTrailingBr(_1f9.blockNode);return false;}}else{_1f9.blockNode=this.editor.editNode;}_1f3=dijit.range.getSelection(this.editor.window);_1f4=_1f3.getRangeAt(0);}var _1fb=doc.createElement(this.blockNodeForEnter);_1fb.innerHTML=this.bogusHtmlContent;this.removeTrailingBr(_1f9.blockNode);if(dijit.range.atEndOfContainer(_1f9.blockNode,_1f4.endContainer,_1f4.endOffset)){if(_1f9.blockNode===_1f9.blockContainer){_1f9.blockNode.appendChild(_1fb);}else{dojo.place(_1fb,_1f9.blockNode,"after");}_1f8=false;_1f5=dijit.range.create(this.editor.window);_1f5.setStart(_1fb,0);_1f3.removeAllRanges();_1f3.addRange(_1f5);if(this.editor.height){dijit.scrollIntoView(_1fb);}}else{if(dijit.range.atBeginningOfContainer(_1f9.blockNode,_1f4.startContainer,_1f4.startOffset)){dojo.place(_1fb,_1f9.blockNode,_1f9.blockNode===_1f9.blockContainer?"first":"before");if(_1fb.nextSibling&&this.editor.height){_1f5=dijit.range.create(this.editor.window);_1f5.setStart(_1fb.nextSibling,0);_1f3.removeAllRanges();_1f3.addRange(_1f5);dijit.scrollIntoView(_1fb.nextSibling);}_1f8=false;}else{if(dojo.isMoz){this._pressedEnterInBlock=_1f9.blockNode;}}}return _1f8;},removeTrailingBr:function(_1fc){var para=/P|DIV|LI/i.test(_1fc.tagName)?_1fc:dijit._editor.selection.getParentOfType(_1fc,["P","DIV","LI"]);if(!para){return;}if(para.lastChild){if((para.childNodes.length>1&&para.lastChild.nodeType==3&&/^[\s\xAD]*$/.test(para.lastChild.nodeValue))||para.lastChild.tagName=="BR"){dojo.destroy(para.lastChild);}}if(!para.childNodes.length){para.innerHTML=this.bogusHtmlContent;}},_fixNewLineBehaviorForIE:function(d){var doc=this.editor.document;if(doc.__INSERTED_EDITIOR_NEWLINE_CSS===undefined){var _1fd=dojo.create("style",{type:"text/css"},doc.getElementsByTagName("head")[0]);_1fd.styleSheet.cssText="p{margin:0;}";this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS=true;}return d;},regularPsToSingleLinePs:function(_1fe,_1ff){function _200(el){function _201(_202){var newP=_202[0].ownerDocument.createElement("p");_202[0].parentNode.insertBefore(newP,_202[0]);dojo.forEach(_202,function(node){newP.appendChild(node);});};var _203=0;var _204=[];var _205;while(_203<el.childNodes.length){_205=el.childNodes[_203];if(_205.nodeType==3||(_205.nodeType==1&&_205.nodeName!="BR"&&dojo.style(_205,"display")!="block")){_204.push(_205);}else{var _206=_205.nextSibling;if(_204.length){_201(_204);_203=(_203+1)-_204.length;if(_205.nodeName=="BR"){dojo.destroy(_205);}}_204=[];}_203++;}if(_204.length){_201(_204);}};function _207(el){var _208=null;var _209=[];var _20a=el.childNodes.length-1;for(var i=_20a;i>=0;i--){_208=el.childNodes[i];if(_208.nodeName=="BR"){var newP=_208.ownerDocument.createElement("p");dojo.place(newP,el,"after");if(_209.length==0&&i!=_20a){newP.innerHTML="&nbsp;";}dojo.forEach(_209,function(node){newP.appendChild(node);});dojo.destroy(_208);_209=[];}else{_209.unshift(_208);}}};var _20b=[];var ps=_1fe.getElementsByTagName("p");dojo.forEach(ps,function(p){_20b.push(p);});dojo.forEach(_20b,function(p){var _20c=p.previousSibling;if((_20c)&&(_20c.nodeType==1)&&(_20c.nodeName=="P"||dojo.style(_20c,"display")!="block")){var newP=p.parentNode.insertBefore(this.document.createElement("p"),p);newP.innerHTML=_1ff?"":"&nbsp;";}_207(p);},this.editor);_200(_1fe);return _1fe;},singleLinePsToRegularPs:function(_20d){function _20e(node){var ps=node.getElementsByTagName("p");var _20f=[];for(var i=0;i<ps.length;i++){var p=ps[i];var _210=false;for(var k=0;k<_20f.length;k++){if(_20f[k]===p.parentNode){_210=true;break;}}if(!_210){_20f.push(p.parentNode);}}return _20f;};function _211(node){return (!node.childNodes.length||node.innerHTML=="&nbsp;");};var _212=_20e(_20d);for(var i=0;i<_212.length;i++){var _213=_212[i];var _214=null;var node=_213.firstChild;var _215=null;while(node){if(node.nodeType!=1||node.tagName!="P"||(node.getAttributeNode("style")||{}).specified){_214=null;}else{if(_211(node)){_215=node;_214=null;}else{if(_214==null){_214=node;}else{if((!_214.lastChild||_214.lastChild.nodeName!="BR")&&(node.firstChild)&&(node.firstChild.nodeName!="BR")){_214.appendChild(this.editor.document.createElement("br"));}while(node.firstChild){_214.appendChild(node.firstChild);}_215=node;}}}node=node.nextSibling;if(_215){dojo.destroy(_215);_215=null;}}}return _20d;}});}if(!dojo._hasResource["dijit.Editor"]){dojo._hasResource["dijit.Editor"]=true;dojo.provide("dijit.Editor");dojo.declare("dijit.Editor",dijit._editor.RichText,{plugins:null,extraPlugins:null,constructor:function(){if(!dojo.isArray(this.plugins)){this.plugins=["undo","redo","|","cut","copy","paste","|","bold","italic","underline","strikethrough","|","insertOrderedList","insertUnorderedList","indent","outdent","|","justifyLeft","justifyRight","justifyCenter","justifyFull","dijit._editor.plugins.EnterKeyHandling"];}this._plugins=[];this._editInterval=this.editActionInterval*1000;if(dojo.isIE){this.events.push("onBeforeDeactivate");this.events.push("onBeforeActivate");}},postCreate:function(){if(this.customUndo){dojo["require"]("dijit._editor.range");this._steps=this._steps.slice(0);this._undoedSteps=this._undoedSteps.slice(0);}if(dojo.isArray(this.extraPlugins)){this.plugins=this.plugins.concat(this.extraPlugins);}this.inherited(arguments);this.commands=dojo.i18n.getLocalization("dijit._editor","commands",this.lang);if(!this.toolbar){this.toolbar=new dijit.Toolbar({});dojo.place(this.toolbar.domNode,this.editingArea,"before");}dojo.forEach(this.plugins,this.addPlugin,this);this.onNormalizedDisplayChanged();this.toolbar.startup();},destroy:function(){dojo.forEach(this._plugins,function(p){if(p&&p.destroy){p.destroy();}});this._plugins=[];this.toolbar.destroyRecursive();delete this.toolbar;this.inherited(arguments);},addPlugin:function(_216,_217){var args=dojo.isString(_216)?{name:_216}:_216;if(!args.setEditor){var o={"args":args,"plugin":null,"editor":this};dojo.publish(dijit._scopeName+".Editor.getPlugin",[o]);if(!o.plugin){var pc=dojo.getObject(args.name);if(pc){o.plugin=new pc(args);}}if(!o.plugin){console.warn("Cannot find plugin",_216);return;}_216=o.plugin;}if(arguments.length>1){this._plugins[_217]=_216;}else{this._plugins.push(_216);}_216.setEditor(this);if(dojo.isFunction(_216.setToolbar)){_216.setToolbar(this.toolbar);}},startup:function(){},resize:function(size){if(size){dijit.layout._LayoutWidget.prototype.resize.apply(this,arguments);}},layout:function(){this.editingArea.style.height=(this._contentBox.h-dojo.marginBox(this.toolbar.domNode).h)+"px";if(this.iframe){this.iframe.style.height="100%";}this._layoutMode=true;},_onIEMouseDown:function(e){var _218=this.document.body.componentFromPoint(e.x,e.y);if(!_218){delete this._savedSelection;if(e.target.tagName=="BODY"){setTimeout(dojo.hitch(this,"placeCursorAtEnd"),0);}this.inherited(arguments);}},onBeforeActivate:function(e){this._restoreSelection();},onBeforeDeactivate:function(e){if(this.customUndo){this.endEditing(true);}if(e.target.tagName!="BODY"){this._saveSelection();}},customUndo:dojo.isIE,editActionInterval:3,beginEditing:function(cmd){if(!this._inEditing){this._inEditing=true;this._beginEditing(cmd);}if(this.editActionInterval>0){if(this._editTimer){clearTimeout(this._editTimer);}this._editTimer=setTimeout(dojo.hitch(this,this.endEditing),this._editInterval);}},_steps:[],_undoedSteps:[],execCommand:function(cmd){if(this.customUndo&&(cmd=="undo"||cmd=="redo")){return this[cmd]();}else{if(this.customUndo){this.endEditing();this._beginEditing();}var r;try{r=this.inherited("execCommand",arguments);if(dojo.isWebKit&&cmd=="paste"&&!r){throw {code:1011};}}catch(e){if(e.code==1011&&/copy|cut|paste/.test(cmd)){var sub=dojo.string.substitute,_219={cut:"X",copy:"C",paste:"V"};alert(sub(this.commands.systemShortcut,[this.commands[cmd],sub(this.commands[dojo.isMac?"appleKey":"ctrlKey"],[_219[cmd]])]));}r=false;}if(this.customUndo){this._endEditing();}return r;}},queryCommandEnabled:function(cmd){if(this.customUndo&&(cmd=="undo"||cmd=="redo")){return cmd=="undo"?(this._steps.length>1):(this._undoedSteps.length>0);}else{return this.inherited("queryCommandEnabled",arguments);}},_moveToBookmark:function(b){var _21a=b.mark;var mark=b.mark;var col=b.isCollapsed;if(dojo.isIE){if(dojo.isArray(mark)){_21a=[];dojo.forEach(mark,function(n){_21a.push(dijit.range.getNode(n,this.editNode));},this);}}else{var r=dijit.range.create(this.window);r.setStart(dijit.range.getNode(b.startContainer,this.editNode),b.startOffset);r.setEnd(dijit.range.getNode(b.endContainer,this.editNode),b.endOffset);_21a=r;}dojo.withGlobal(this.window,"moveToBookmark",dijit,[{mark:_21a,isCollapsed:col}]);},_changeToStep:function(from,to){this.setValue(to.text);var b=to.bookmark;if(!b){return;}this._moveToBookmark(b);},undo:function(){this.endEditing(true);var s=this._steps.pop();if(this._steps.length>0){this.focus();this._changeToStep(s,this._steps[this._steps.length-1]);this._undoedSteps.push(s);this.onDisplayChanged();return true;}return false;},redo:function(){this.endEditing(true);var s=this._undoedSteps.pop();if(s&&this._steps.length>0){this.focus();this._changeToStep(this._steps[this._steps.length-1],s);this._steps.push(s);this.onDisplayChanged();return true;}return false;},endEditing:function(_21b){if(this._editTimer){clearTimeout(this._editTimer);}if(this._inEditing){this._endEditing(_21b);this._inEditing=false;}},_getBookmark:function(){var b=dojo.withGlobal(this.window,dijit.getBookmark);var tmp=[];if(b.mark){var mark=b.mark;if(dojo.isIE){if(dojo.isArray(mark)){dojo.forEach(mark,function(n){tmp.push(dijit.range.getIndex(n,this.editNode).o);},this);b.mark=tmp;}}else{tmp=dijit.range.getIndex(mark.startContainer,this.editNode).o;b.mark={startContainer:tmp,startOffset:mark.startOffset,endContainer:mark.endContainer===mark.startContainer?tmp:dijit.range.getIndex(mark.endContainer,this.editNode).o,endOffset:mark.endOffset};}}return b;},_beginEditing:function(cmd){if(this._steps.length===0){this._steps.push({"text":this.savedContent,"bookmark":this._getBookmark()});}},_endEditing:function(_21c){var v=this.getValue(true);this._undoedSteps=[];this._steps.push({text:v,bookmark:this._getBookmark()});},onKeyDown:function(e){if(!dojo.isIE&&!this.iframe&&e.keyCode==dojo.keys.TAB&&!this.tabIndent){this._saveSelection();}if(!this.customUndo){this.inherited(arguments);return;}var k=e.keyCode,ks=dojo.keys;if(e.ctrlKey&&!e.altKey){if(k==90||k==122){dojo.stopEvent(e);this.undo();return;}else{if(k==89||k==121){dojo.stopEvent(e);this.redo();return;}}}this.inherited(arguments);switch(k){case ks.ENTER:case ks.BACKSPACE:case ks.DELETE:this.beginEditing();break;case 88:case 86:if(e.ctrlKey&&!e.altKey&&!e.metaKey){this.endEditing();if(e.keyCode==88){this.beginEditing("cut");setTimeout(dojo.hitch(this,this.endEditing),1);}else{this.beginEditing("paste");setTimeout(dojo.hitch(this,this.endEditing),1);}break;}default:if(!e.ctrlKey&&!e.altKey&&!e.metaKey&&(e.keyCode<dojo.keys.F1||e.keyCode>dojo.keys.F15)){this.beginEditing();break;}case ks.ALT:this.endEditing();break;case ks.UP_ARROW:case ks.DOWN_ARROW:case ks.LEFT_ARROW:case ks.RIGHT_ARROW:case ks.HOME:case ks.END:case ks.PAGE_UP:case ks.PAGE_DOWN:this.endEditing(true);break;case ks.CTRL:case ks.SHIFT:case ks.TAB:break;}},_onBlur:function(){this.inherited("_onBlur",arguments);this.endEditing(true);},_saveSelection:function(){this._savedSelection=this._getBookmark();},_restoreSelection:function(){if(this._savedSelection){if(dojo.withGlobal(this.window,"isCollapsed",dijit)){this._moveToBookmark(this._savedSelection);}delete this._savedSelection;}},onClick:function(){this.endEditing(true);this.inherited(arguments);}});dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){if(o.plugin){return;}var args=o.args,p;var _21d=dijit._editor._Plugin;var name=args.name;switch(name){case "undo":case "redo":case "cut":case "copy":case "paste":case "insertOrderedList":case "insertUnorderedList":case "indent":case "outdent":case "justifyCenter":case "justifyFull":case "justifyLeft":case "justifyRight":case "delete":case "selectAll":case "removeFormat":case "unlink":case "insertHorizontalRule":p=new _21d({command:name});break;case "bold":case "italic":case "underline":case "strikethrough":case "subscript":case "superscript":p=new _21d({buttonClass:dijit.form.ToggleButton,command:name});break;case "|":p=new _21d({button:new dijit.ToolbarSeparator()});}o.plugin=p;});}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(_21e){if(_21e&&!("label" in this.params)){this.attr("label",_21e.innerHTML);}},postCreate:function(){dojo.setSelectable(this.domNode,false);var _21f=this.id+"_text";dojo.attr(this.containerNode,"id",_21f);if(this.accelKeyNode){dojo.attr(this.accelKeyNode,"id",this.id+"_accel");_21f+=" "+this.id+"_accel";}dijit.setWaiState(this.domNode,"labelledby",_21f);},_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(_220){dojo.toggleClass(this.domNode,"dijitMenuItemSelected",_220);},setLabel:function(_221){dojo.deprecated("dijit.MenuItem.setLabel() is deprecated.  Use attr('label', ...) instead.","","2.0");this.attr("label",_221);},setDisabled:function(_222){dojo.deprecated("dijit.Menu.setDisabled() is deprecated.  Use attr('disabled', bool) instead.","","2.0");this.attr("disabled",_222);},_setDisabledAttr:function(_223){this.disabled=_223;dojo[_223?"addClass":"removeClass"](this.domNode,"dijitMenuItemDisabled");dijit.setWaiState(this.focusNode,"disabled",_223?"true":"false");},_setAccelKeyAttr:function(_224){this.accelKey=_224;this.accelKeyNode.style.display=_224?"":"none";this.accelKeyNode.innerHTML=_224;dojo.attr(this.containerNode,"colSpan",_224?"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 _225=dojo.query("*",this.srcNodeRef);dijit.PopupMenuItem.superclass._fillContent.call(this,_225[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(_226){dojo.toggleClass(this.domNode,"dijitCheckedMenuItemChecked",_226);dijit.setWaiState(this.domNode,"checked",_226);this.checked=_226;},onChange:function(_227){},_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(_228){_228.startup();});this.startupKeyNavChildren();this.inherited(arguments);},onExecute:function(){},onCancel:function(_229){},_moveToPopup:function(evt){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.focusedChild._onClick(evt);}else{var _22a=this._getTopMenu();if(_22a&&_22a._isMenuBar){_22a.focusNext();}}},_onPopupHover:function(evt){if(this.currentPopup&&this.currentPopup._pendingClose_timer){var _22b=this.currentPopup.parentMenu;if(_22b.focusedChild){_22b.focusedChild._setSelected(false);}_22b.focusedChild=this.currentPopup.from_item;_22b.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 _22c=item.popup;if(_22c){this._stopPendingCloseTimer(_22c);_22c._pendingClose_timer=setTimeout(function(){_22c._pendingClose_timer=null;if(_22c.parentMenu){_22c.parentMenu.currentPopup=null;}dijit.popup.close(_22c);},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(_22d){if(_22d._pendingClose_timer){clearTimeout(_22d._pendingClose_timer);_22d._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 _22e=this.focusedChild;if(!_22e){return;}var _22f=_22e.popup;if(_22f.isShowingNow){return;}if(this.currentPopup){this._stopPendingCloseTimer(this.currentPopup);dijit.popup.close(this.currentPopup);}_22f.parentMenu=this;_22f.from_item=_22e;var self=this;dijit.popup.open({parent:this,popup:_22f,around:_22e.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(_22e);self._cleanUp();_22e._setSelected(true);self.focusedChild=_22e;},onExecute:dojo.hitch(this,"_cleanUp")});this.currentPopup=_22f;_22f.connect(_22f.domNode,"onmouseenter",dojo.hitch(self,"_onPopupHover"));if(_22f.focus){_22f._focus_timer=setTimeout(dojo.hitch(_22f,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(_230){var win=dijit.getDocumentWindow(this._iframeContentDocument(_230))||this._iframeContentDocument(_230)["__parent__"]||(_230.name&&dojo.doc.frames[_230.name])||null;return win;},_iframeContentDocument:function(_231){var doc=_231.contentDocument||(_231.contentWindow&&_231.contentWindow.document)||(_231.name&&dojo.doc.frames[_231.name]&&dojo.doc.frames[_231.name].document)||null;return doc;},bindDomNode:function(node){node=dojo.byId(node);var cn;if(node.tagName.toLowerCase()=="iframe"){var _232=node,win=this._iframeContentWindow(_232);cn=dojo.withGlobal(win,dojo.body);}else{cn=(node==dojo.body()?dojo.doc.documentElement:node);}var _233={node:node,iframe:_232};dojo.attr(node,"_dijitMenu"+this.id,this._bindings.push(_233));var _234=dojo.hitch(this,function(cn){return [dojo.connect(cn,(this.leftClickToOpen)?"onclick":"oncontextmenu",this,function(evt){this._openMyself(evt,cn,_232);}),dojo.connect(cn,"onkeydown",this,"_contextKey"),dojo.connect(cn,"onmousedown",this,"_contextMouse")];});_233.connects=cn?_234(cn):[];if(_232){_233.onloadHandler=dojo.hitch(this,function(){var win=this._iframeContentWindow(_232);cn=dojo.withGlobal(win,dojo.body);_233.connects=_234(cn);});if(_232.addEventListener){_232.addEventListener("load",_233.onloadHandler,false);}else{_232.attachEvent("onload",_233.onloadHandler);}}},unBindDomNode:function(_235){var node;try{node=dojo.byId(_235);}catch(e){return;}var _236="_dijitMenu"+this.id;if(node&&dojo.hasAttr(node,_236)){var bid=dojo.attr(node,_236)-1,b=this._bindings[bid];dojo.forEach(b.connects,dojo.disconnect);var _237=b.iframe;if(_237){if(_237.removeEventListener){_237.removeEventListener("load",b.onloadHandler,false);}else{_237.detachEvent("onload",b.onloadHandler);}}dojo.removeAttr(node,_236);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 _238={target:e.target,pageX:e.pageX,pageY:e.pageY};_238.preventDefault=_238.stopPropagation=function(){};window.setTimeout(dojo.hitch(this,function(){this._openMyself(_238);}),1);}}},_contextMouse:function(e){this._contextMenuWithMouse=true;},_openMyself:function(e,node,_239){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(_239){var od=e.target.ownerDocument,ifc=dojo.position(_239,true),win=this._iframeContentWindow(_239),_23a=dojo.withGlobal(win,"_docScroll",dojo);var cs=dojo.getComputedStyle(_239),tp=dojo._toPixelValue,left=(dojo.isIE&&dojo.isQuirks?0:tp(_239,cs.paddingLeft))+(dojo.isIE&&dojo.isQuirks?tp(_239,cs.borderLeftWidth):0),top=(dojo.isIE&&dojo.isQuirks?0:tp(_239,cs.paddingTop))+(dojo.isIE&&dojo.isQuirks?tp(_239,cs.borderTopWidth):0);x+=ifc.x+left-_23a.x;y+=ifc.y+top-_23a.y;}}else{var _23b=dojo.position(e.target,true);x=_23b.x+10;y=_23b.y+10;}var self=this;var _23c=dijit.getFocus(this);function _23d(){if(self.refocus){dijit.focus(_23c);}dijit.popup.close(self);};dijit.popup.open({popup:this,x:x,y:y,onExecute:_23d,onCancel:_23d,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["dijit.MenuBar"]){dojo._hasResource["dijit.MenuBar"]=true;dojo.provide("dijit.MenuBar");dojo.declare("dijit.MenuBar",dijit._MenuBase,{templateString:dojo.cache("dijit","templates/MenuBar.html","<div class=\"dijitMenuBar dijitMenuPassive\" dojoAttachPoint=\"containerNode\"  waiRole=\"menubar\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress: _onKeyPress\"></div>\n"),_isMenuBar:true,constructor:function(){this._orient=this.isLeftToRight()?{BL:"TL"}:{BR:"TR"};},postCreate:function(){var k=dojo.keys,l=this.isLeftToRight();this.connectKeyNavHandlers(l?[k.LEFT_ARROW]:[k.RIGHT_ARROW],l?[k.RIGHT_ARROW]:[k.LEFT_ARROW]);},focusChild:function(item){var _23e=this.focusedChild,_23f=_23e&&_23e.popup&&_23e.popup.isShowingNow;this.inherited(arguments);if(_23f&&item.popup&&!item.disabled){this._openPopup();}},_onKeyPress:function(evt){if(evt.ctrlKey||evt.altKey){return;}switch(evt.charOrCode){case dojo.keys.DOWN_ARROW:this._moveToPopup(evt);dojo.stopEvent(evt);}},onItemClick:function(item,evt){if(item.popup&&item.popup.isShowingNow){item.popup.onCancel();}else{this.inherited(arguments);}}});}if(!dojo._hasResource["dijit.MenuBarItem"]){dojo._hasResource["dijit.MenuBarItem"]=true;dojo.provide("dijit.MenuBarItem");dojo.declare("dijit._MenuBarItemMixin",null,{templateString:dojo.cache("dijit","templates/MenuBarItem.html","<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"'\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<span dojoAttachPoint=\"containerNode\"></span>\n</div>\n"),attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{label:{node:"containerNode",type:"innerHTML"}})});dojo.declare("dijit.MenuBarItem",[dijit.MenuItem,dijit._MenuBarItemMixin],{});}if(!dojo._hasResource["dijit.PopupMenuBarItem"]){dojo._hasResource["dijit.PopupMenuBarItem"]=true;dojo.provide("dijit.PopupMenuBarItem");dojo.declare("dijit.PopupMenuBarItem",[dijit.PopupMenuItem,dijit._MenuBarItemMixin],{});}if(!dojo._hasResource["dojo.regexp"]){dojo._hasResource["dojo.regexp"]=true;dojo.provide("dojo.regexp");dojo.regexp.escapeString=function(str,_240){return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(ch){if(_240&&_240.indexOf(ch)!=-1){return ch;}return "\\"+ch;});};dojo.regexp.buildGroupRE=function(arr,re,_241){if(!(arr instanceof Array)){return re(arr);}var b=[];for(var i=0;i<arr.length;i++){b.push(re(arr[i]));}return dojo.regexp.group(b.join("|"),_241);};dojo.regexp.group=function(_242,_243){return "("+(_243?"?:":"")+_242+")";};}if(!dojo._hasResource["dojo.number"]){dojo._hasResource["dojo.number"]=true;dojo.provide("dojo.number");dojo.number.format=function(_244,_245){_245=dojo.mixin({},_245||{});var _246=dojo.i18n.normalizeLocale(_245.locale);var _247=dojo.i18n.getLocalization("dojo.cldr","number",_246);_245.customs=_247;var _248=_245.pattern||_247[(_245.type||"decimal")+"Format"];if(isNaN(_244)||Math.abs(_244)==Infinity){return null;}return dojo.number._applyPattern(_244,_248,_245);};dojo.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;dojo.number._applyPattern=function(_249,_24a,_24b){_24b=_24b||{};var _24c=_24b.customs.group;var _24d=_24b.customs.decimal;var _24e=_24a.split(";");var _24f=_24e[0];_24a=_24e[(_249<0)?1:0]||("-"+_24f);if(_24a.indexOf("%")!=-1){_249*=100;}else{if(_24a.indexOf("‰")!=-1){_249*=1000;}else{if(_24a.indexOf("¤")!=-1){_24c=_24b.customs.currencyGroup||_24c;_24d=_24b.customs.currencyDecimal||_24d;_24a=_24a.replace(/\u00a4{1,3}/,function(_250){var prop=["symbol","currency","displayName"][_250.length-1];return _24b[prop]||_24b.currency||"";});}else{if(_24a.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _251=dojo.number._numberPatternRE;var _252=_24f.match(_251);if(!_252){throw new Error("unable to find a number expression in pattern: "+_24a);}if(_24b.fractional===false){_24b.places=0;}return _24a.replace(_251,dojo.number._formatAbsolute(_249,_252[0],{decimal:_24d,group:_24c,places:_24b.places,round:_24b.round}));};dojo.number.round=function(_253,_254,_255){var _256=10/(_255||10);return (_256*+_253).toFixed(_254)/_256;};if((0.9).toFixed()==0){(function(){var _257=dojo.number.round;dojo.number.round=function(v,p,m){var d=Math.pow(10,-p||0),a=Math.abs(v);if(!v||a>=d||a*Math.pow(10,p+1)<5){d=0;}return _257(v,p,m)+(v>0?d:-d);};})();}dojo.number._formatAbsolute=function(_258,_259,_25a){_25a=_25a||{};if(_25a.places===true){_25a.places=0;}if(_25a.places===Infinity){_25a.places=6;}var _25b=_259.split(".");var _25c=(_25a.places>=0)?_25a.places:(_25b[1]&&_25b[1].length)||0;if(!(_25a.round<0)){_258=dojo.number.round(_258,_25c,_25a.round);}var _25d=String(Math.abs(_258)).split(".");var _25e=_25d[1]||"";if(_25a.places){var _25f=dojo.isString(_25a.places)&&_25a.places.indexOf(",");if(_25f){_25a.places=_25a.places.substring(_25f+1);}_25d[1]=dojo.string.pad(_25e.substr(0,_25a.places),_25a.places,"0",true);}else{if(_25b[1]&&_25a.places!==0){var pad=_25b[1].lastIndexOf("0")+1;if(pad>_25e.length){_25d[1]=dojo.string.pad(_25e,pad,"0",true);}var _260=_25b[1].length;if(_260<_25e.length){_25d[1]=_25e.substr(0,_260);}}else{if(_25d[1]){_25d.pop();}}}var _261=_25b[0].replace(",","");pad=_261.indexOf("0");if(pad!=-1){pad=_261.length-pad;if(pad>_25d[0].length){_25d[0]=dojo.string.pad(_25d[0],pad);}if(_261.indexOf("#")==-1){_25d[0]=_25d[0].substr(_25d[0].length-pad);}}var _262=_25b[0].lastIndexOf(",");var _263,_264;if(_262!=-1){_263=_25b[0].length-_262-1;var _265=_25b[0].substr(0,_262);_262=_265.lastIndexOf(",");if(_262!=-1){_264=_265.length-_262-1;}}var _266=[];for(var _267=_25d[0];_267;){var off=_267.length-_263;_266.push((off>0)?_267.substr(off):_267);_267=(off>0)?_267.slice(0,off):"";if(_264){_263=_264;delete _264;}}_25d[0]=_266.reverse().join(_25a.group||",");return _25d.join(_25a.decimal||".");};dojo.number.regexp=function(_268){return dojo.number._parseInfo(_268).regexp;};dojo.number._parseInfo=function(_269){_269=_269||{};var _26a=dojo.i18n.normalizeLocale(_269.locale);var _26b=dojo.i18n.getLocalization("dojo.cldr","number",_26a);var _26c=_269.pattern||_26b[(_269.type||"decimal")+"Format"];var _26d=_26b.group;var _26e=_26b.decimal;var _26f=1;if(_26c.indexOf("%")!=-1){_26f/=100;}else{if(_26c.indexOf("‰")!=-1){_26f/=1000;}else{var _270=_26c.indexOf("¤")!=-1;if(_270){_26d=_26b.currencyGroup||_26d;_26e=_26b.currencyDecimal||_26e;}}}var _271=_26c.split(";");if(_271.length==1){_271.push("-"+_271[0]);}var re=dojo.regexp.buildGroupRE(_271,function(_272){_272="(?:"+dojo.regexp.escapeString(_272,".")+")";return _272.replace(dojo.number._numberPatternRE,function(_273){var _274={signed:false,separator:_269.strict?_26d:[_26d,""],fractional:_269.fractional,decimal:_26e,exponent:false};var _275=_273.split(".");var _276=_269.places;if(_275.length==1||_276===0){_274.fractional=false;}else{if(_276===undefined){_276=_269.pattern?_275[1].lastIndexOf("0")+1:Infinity;}if(_276&&_269.fractional==undefined){_274.fractional=true;}if(!_269.places&&(_276<_275[1].length)){_276+=","+_275[1].length;}_274.places=_276;}var _277=_275[0].split(",");if(_277.length>1){_274.groupSize=_277.pop().length;if(_277.length>1){_274.groupSize2=_277.pop().length;}}return "("+dojo.number._realNumberRegexp(_274)+")";});},true);if(_270){re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_278,_279,_27a,_27b){var prop=["symbol","currency","displayName"][_27a.length-1];var _27c=dojo.regexp.escapeString(_269[prop]||_269.currency||"");_279=_279?"[\\s\\xa0]":"";_27b=_27b?"[\\s\\xa0]":"";if(!_269.strict){if(_279){_279+="*";}if(_27b){_27b+="*";}return "(?:"+_279+_27c+_27b+")?";}return _279+_27c+_27b;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_26d,decimal:_26e,factor:_26f};};dojo.number.parse=function(_27d,_27e){var info=dojo.number._parseInfo(_27e);var _27f=(new RegExp("^"+info.regexp+"$")).exec(_27d);if(!_27f){return NaN;}var _280=_27f[1];if(!_27f[1]){if(!_27f[2]){return NaN;}_280=_27f[2];info.factor*=-1;}_280=_280.replace(new RegExp("["+info.group+"\\s\\xa0"+"]","g"),"").replace(info.decimal,".");return _280*info.factor;};dojo.number._realNumberRegexp=function(_281){_281=_281||{};if(!("places" in _281)){_281.places=Infinity;}if(typeof _281.decimal!="string"){_281.decimal=".";}if(!("fractional" in _281)||/^0/.test(_281.places)){_281.fractional=[true,false];}if(!("exponent" in _281)){_281.exponent=[true,false];}if(!("eSigned" in _281)){_281.eSigned=[true,false];}var _282=dojo.number._integerRegexp(_281);var _283=dojo.regexp.buildGroupRE(_281.fractional,function(q){var re="";if(q&&(_281.places!==0)){re="\\"+_281.decimal;if(_281.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_281.places+"}";}}return re;},true);var _284=dojo.regexp.buildGroupRE(_281.exponent,function(q){if(q){return "([eE]"+dojo.number._integerRegexp({signed:_281.eSigned})+")";}return "";});var _285=_282+_283;if(_283){_285="(?:(?:"+_285+")|(?:"+_283+"))";}return _285+_284;};dojo.number._integerRegexp=function(_286){_286=_286||{};if(!("signed" in _286)){_286.signed=[true,false];}if(!("separator" in _286)){_286.separator="";}else{if(!("groupSize" in _286)){_286.groupSize=3;}}var _287=dojo.regexp.buildGroupRE(_286.signed,function(q){return q?"[-+]":"";},true);var _288=dojo.regexp.buildGroupRE(_286.separator,function(sep){if(!sep){return "(?:\\d+)";}sep=dojo.regexp.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_286.groupSize,grp2=_286.groupSize2;if(grp2){var _289="(?:0|[1-9]\\d{0,"+(grp2-1)+"}(?:["+sep+"]\\d{"+grp2+"})*["+sep+"]\\d{"+grp+"})";return ((grp-grp2)>0)?"(?:"+_289+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_289;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _287+_288;};}if(!dojo._hasResource["dijit.ProgressBar"]){dojo._hasResource["dijit.ProgressBar"]=true;dojo.provide("dijit.ProgressBar");dojo.declare("dijit.ProgressBar",[dijit._Widget,dijit._Templated],{progress:"0",maximum:100,places:0,indeterminate:false,name:"",templateString:dojo.cache("dijit","templates/ProgressBar.html","<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\"></div\n\t\t><span style=\"visibility:hidden\">&nbsp;</span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${id}_label\">&nbsp;</div\n\t><img dojoAttachPoint=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n\t></img\n></div>\n"),_indeterminateHighContrastImagePath:dojo.moduleUrl("dijit","themes/a11y/indeterminate_progress.gif"),postCreate:function(){this.inherited(arguments);this.indeterminateHighContrastImage.setAttribute("src",this._indeterminateHighContrastImagePath.toString());this.update();},update:function(_28a){dojo.mixin(this,_28a||{});var tip=this.internalProgress;var _28b=1,_28c;if(this.indeterminate){_28c="addClass";dijit.removeWaiState(tip,"valuenow");dijit.removeWaiState(tip,"valuemin");dijit.removeWaiState(tip,"valuemax");}else{_28c="removeClass";if(String(this.progress).indexOf("%")!=-1){_28b=Math.min(parseFloat(this.progress)/100,1);this.progress=_28b*this.maximum;}else{this.progress=Math.min(this.progress,this.maximum);_28b=this.progress/this.maximum;}var text=this.report(_28b);this.label.firstChild.nodeValue=text;dijit.setWaiState(tip,"describedby",this.label.id);dijit.setWaiState(tip,"valuenow",this.progress);dijit.setWaiState(tip,"valuemin",0);dijit.setWaiState(tip,"valuemax",this.maximum);}dojo[_28c](this.domNode,"dijitProgressBarIndeterminate");tip.style.width=(_28b*100)+"%";this.onChange();},_setValueAttr:function(v){if(v==Infinity){this.update({indeterminate:true});}else{this.update({indeterminate:false,progress:v});}},_getValueAttr:function(){return this.progress;},report:function(_28d){return dojo.number.format(_28d,{type:"percent",places:this.places,locale:this.lang});},onChange:function(){}});}if(!dojo._hasResource["dijit.TitlePane"]){dojo._hasResource["dijit.TitlePane"]=true;dojo.provide("dijit.TitlePane");dojo.declare("dijit.TitlePane",[dijit.layout.ContentPane,dijit._Templated],{title:"",open:true,toggleable:true,tabIndex:"0",duration:dijit.defaultDuration,baseClass:"dijitTitlePane",templateString:dojo.cache("dijit","templates/TitlePane.html","<div class=\"${baseClass}\">\n\t<div dojoAttachEvent=\"onclick:_onTitleClick, onkeypress:_onTitleKey, onfocus:_handleFocus, onblur:_handleFocus, onmouseenter:_onTitleEnter, onmouseleave:_onTitleLeave\"\n\t\t\tclass=\"dijitTitlePaneTitle\" dojoAttachPoint=\"titleBarNode,focusNode\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"arrowNode\" class=\"dijitArrowNode\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span\n\t\t><span dojoAttachPoint=\"titleNode\" class=\"dijitTitlePaneTextNode\"></span>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" dojoAttachPoint=\"hideNode\" waiRole=\"presentation\">\n\t\t<div class=\"dijitReset\" dojoAttachPoint=\"wipeNode\" waiRole=\"presentation\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\" id=\"${id}_pane\">\n\t\t\t\t<!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc.  Put padding on inner div. -->\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n"),attributeMap:dojo.delegate(dijit.layout.ContentPane.prototype.attributeMap,{title:{node:"titleNode",type:"innerHTML"},tooltip:{node:"focusNode",type:"attribute",attribute:"title"},id:""}),postCreate:function(){if(!this.open){this.hideNode.style.display=this.wipeNode.style.display="none";}this._setCss();dojo.setSelectable(this.titleNode,false);dijit.setWaiState(this.containerNode,"hidden",this.open?"false":"true");dijit.setWaiState(this.focusNode,"pressed",this.open?"true":"false");var _28e=this.hideNode,_28f=this.wipeNode;this._wipeIn=dojo.fx.wipeIn({node:this.wipeNode,duration:this.duration,beforeBegin:function(){_28e.style.display="";}});this._wipeOut=dojo.fx.wipeOut({node:this.wipeNode,duration:this.duration,onEnd:function(){_28e.style.display="none";}});this.inherited(arguments);},_setOpenAttr:function(open){if(this.open!==open){this.toggle();}},_setToggleableAttr:function(_290){this.toggleable=_290;dijit.setWaiRole(this.focusNode,_290?"button":"heading");dojo.attr(this.focusNode,"tabIndex",_290?this.tabIndex:"-1");if(_290){dijit.setWaiState(this.focusNode,"controls",this.id+"_pane");}this._setCss();},_setContentAttr:function(_291){if(!this.open||!this._wipeOut||this._wipeOut.status()=="playing"){this.inherited(arguments);}else{if(this._wipeIn&&this._wipeIn.status()=="playing"){this._wipeIn.stop();}dojo.marginBox(this.wipeNode,{h:dojo.marginBox(this.wipeNode).h});this.inherited(arguments);if(this._wipeIn){this._wipeIn.play();}else{this.hideNode.style.display="";}}},toggle:function(){dojo.forEach([this._wipeIn,this._wipeOut],function(_292){if(_292&&_292.status()=="playing"){_292.stop();}});var anim=this[this.open?"_wipeOut":"_wipeIn"];if(anim){anim.play();}else{this.hideNode.style.display=this.open?"":"none";}this.open=!this.open;dijit.setWaiState(this.containerNode,"hidden",this.open?"false":"true");dijit.setWaiState(this.focusNode,"pressed",this.open?"true":"false");if(this.open){this._onShow();}else{this.onHide();}this._setCss();},_setCss:function(){var node=this.titleBarNode||this.focusNode;if(this._titleBarClass){dojo.removeClass(node,this._titleBarClass);}this._titleBarClass="dijit"+(this.toggleable?"":"Fixed")+(this.open?"Open":"Closed");dojo.addClass(node,this._titleBarClass);this.arrowNodeInner.innerHTML=this.open?"-":"+";},_onTitleKey:function(e){if(e.charOrCode==dojo.keys.ENTER||e.charOrCode==" "){if(this.toggleable){this.toggle();}dojo.stopEvent(e);}else{if(e.charOrCode==dojo.keys.DOWN_ARROW&&this.open){this.containerNode.focus();e.preventDefault();}}},_onTitleEnter:function(){if(this.toggleable){dojo.addClass(this.focusNode,"dijitTitlePaneTitle-hover");}},_onTitleLeave:function(){if(this.toggleable){dojo.removeClass(this.focusNode,"dijitTitlePaneTitle-hover");}},_onTitleClick:function(){if(this.toggleable){this.toggle();}},_handleFocus:function(e){dojo.toggleClass(this.focusNode,this.baseClass+"Focused",e.type=="focus");},setTitle:function(_293){dojo.deprecated("dijit.TitlePane.setTitle() is deprecated.  Use attr('title', ...) instead.","","2.0");this.attr("title",_293);}});}if(!dojo._hasResource["dijit.Tooltip"]){dojo._hasResource["dijit.Tooltip"]=true;dojo.provide("dijit.Tooltip");dojo.declare("dijit._MasterTooltip",[dijit._Widget,dijit._Templated],{duration:dijit.defaultDuration,templateString:dojo.cache("dijit","templates/Tooltip.html","<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\">\n\t<div class=\"dijitTooltipContainer dijitTooltipContents\" dojoAttachPoint=\"containerNode\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></div>\n</div>\n"),postCreate:function(){dojo.body().appendChild(this.domNode);this.bgIframe=new dijit.BackgroundIframe(this.domNode);this.fadeIn=dojo.fadeIn({node:this.domNode,duration:this.duration,onEnd:dojo.hitch(this,"_onShow")});this.fadeOut=dojo.fadeOut({node:this.domNode,duration:this.duration,onEnd:dojo.hitch(this,"_onHide")});},show:function(_294,_295,_296){if(this.aroundNode&&this.aroundNode===_295){return;}if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_294;this.domNode.style.top=(this.domNode.offsetTop+1)+"px";var pos=dijit.placeOnScreenAroundElement(this.domNode,_295,dijit.getPopupAroundAlignment((_296&&_296.length)?_296:dijit.Tooltip.defaultPosition,this.isLeftToRight()),dojo.hitch(this,"orient"));dojo.style(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_295;},orient:function(node,_297,_298){node.className="dijitTooltip "+{"BL-TL":"dijitTooltipBelow dijitTooltipABLeft","TL-BL":"dijitTooltipAbove dijitTooltipABLeft","BR-TR":"dijitTooltipBelow dijitTooltipABRight","TR-BR":"dijitTooltipAbove dijitTooltipABRight","BR-BL":"dijitTooltipRight","BL-BR":"dijitTooltipLeft"}[_297+"-"+_298];},_onShow:function(){if(dojo.isIE){this.domNode.style.filter="";}},hide:function(_299){if(this._onDeck&&this._onDeck[1]==_299){this._onDeck=null;}else{if(this.aroundNode===_299){this.fadeIn.stop();this.isShowingNow=false;this.aroundNode=null;this.fadeOut.play();}else{}}},_onHide:function(){this.domNode.style.cssText="";if(this._onDeck){this.show.apply(this,this._onDeck);this._onDeck=null;}}});dijit.showTooltip=function(_29a,_29b,_29c){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.show(_29a,_29b,_29c);};dijit.hideTooltip=function(_29d){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.hide(_29d);};dojo.declare("dijit.Tooltip",dijit._Widget,{label:"",showDelay:400,connectId:[],position:[],constructor:function(){this._nodeConnectionsById={};},_setConnectIdAttr:function(_29e){for(var _29f in this._nodeConnectionsById){this.removeTarget(_29f);}dojo.forEach(dojo.isArrayLike(_29e)?_29e:[_29e],this.addTarget,this);},_getConnectIdAttr:function(){var ary=[];for(var id in this._nodeConnectionsById){ary.push(id);}return ary;},addTarget:function(id){var node=dojo.byId(id);if(!node){return;}if(node.id in this._nodeConnectionsById){return;}this._nodeConnectionsById[node.id]=[this.connect(node,"onmouseenter","_onTargetMouseEnter"),this.connect(node,"onmouseleave","_onTargetMouseLeave"),this.connect(node,"onfocus","_onTargetFocus"),this.connect(node,"onblur","_onTargetBlur")];if(dojo.isIE&&!node.style.zoom){node.style.zoom=1;}},removeTarget:function(node){var id=node.id||node;if(id in this._nodeConnectionsById){dojo.forEach(this._nodeConnectionsById[id],this.disconnect,this);delete this._nodeConnectionsById[id];}},postCreate:function(){dojo.addClass(this.domNode,"dijitTooltipData");},startup:function(){this.inherited(arguments);var ids=this.connectId;dojo.forEach(dojo.isArrayLike(ids)?ids:[ids],this.addTarget,this);},_onTargetMouseEnter:function(e){this._onHover(e);},_onTargetMouseLeave:function(e){this._onUnHover(e);},_onTargetFocus:function(e){this._focus=true;this._onHover(e);},_onTargetBlur:function(e){this._focus=false;this._onUnHover(e);},_onHover:function(e){if(!this._showTimer){var _2a0=e.target;this._showTimer=setTimeout(dojo.hitch(this,function(){this.open(_2a0);}),this.showDelay);}},_onUnHover:function(e){if(this._focus){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}this.close();},open:function(_2a1){if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}dijit.showTooltip(this.label||this.domNode.innerHTML,_2a1,this.position);this._connectNode=_2a1;this.onShow(_2a1,this.position);},close:function(){if(this._connectNode){dijit.hideTooltip(this._connectNode);delete this._connectNode;this.onHide();}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}},onShow:function(_2a2,_2a3){},onHide:function(){},uninitialize:function(){this.close();this.inherited(arguments);}});dijit.Tooltip.defaultPosition=["after","before"];}if(!dojo._hasResource["dojo.DeferredList"]){dojo._hasResource["dojo.DeferredList"]=true;dojo.provide("dojo.DeferredList");dojo.declare("dojo.DeferredList",dojo.Deferred,{constructor:function(list,_2a4,_2a5,_2a6,_2a7){this.list=list;this.resultList=new Array(this.list.length);this.chain=[];this.id=this._nextId();this.fired=-1;this.paused=0;this.results=[null,null];this.canceller=_2a7;this.silentlyCancelled=false;if(this.list.length===0&&!_2a4){this.callback(this.resultList);}this.finishedCount=0;this.fireOnOneCallback=_2a4;this.fireOnOneErrback=_2a5;this.consumeErrors=_2a6;dojo.forEach(this.list,function(d,_2a8){d.addCallback(this,function(r){this._cbDeferred(_2a8,true,r);return r;});d.addErrback(this,function(r){this._cbDeferred(_2a8,false,r);return r;});},this);},_cbDeferred:function(_2a9,_2aa,_2ab){this.resultList[_2a9]=[_2aa,_2ab];this.finishedCount+=1;if(this.fired!==0){if(_2aa&&this.fireOnOneCallback){this.callback([_2a9,_2ab]);}else{if(!_2aa&&this.fireOnOneErrback){this.errback(_2ab);}else{if(this.finishedCount==this.list.length){this.callback(this.resultList);}}}}if(!_2aa&&this.consumeErrors){_2ab=null;}return _2ab;},gatherResults:function(_2ac){var d=new dojo.DeferredList(_2ac,false,true,false);d.addCallback(function(_2ad){var ret=[];dojo.forEach(_2ad,function(_2ae){ret.push(_2ae[1]);});return ret;});return d;}});}if(!dojo._hasResource["dojo.cookie"]){dojo._hasResource["dojo.cookie"]=true;dojo.provide("dojo.cookie");dojo.cookie=function(name,_2af,_2b0){var c=document.cookie;if(arguments.length==1){var _2b1=c.match(new RegExp("(?:^|; )"+dojo.regexp.escapeString(name)+"=([^;]*)"));return _2b1?decodeURIComponent(_2b1[1]):undefined;}else{_2b0=_2b0||{};var exp=_2b0.expires;if(typeof exp=="number"){var d=new Date();d.setTime(d.getTime()+exp*24*60*60*1000);exp=_2b0.expires=d;}if(exp&&exp.toUTCString){_2b0.expires=exp.toUTCString();}_2af=encodeURIComponent(_2af);var _2b2=name+"="+_2af,_2b3;for(_2b3 in _2b0){_2b2+="; "+_2b3;var _2b4=_2b0[_2b3];if(_2b4!==true){_2b2+="="+_2b4;}}document.cookie=_2b2;}};dojo.cookie.isSupported=function(){if(!("cookieEnabled" in navigator)){this("__djCookieTest__","CookiesAllowed");navigator.cookieEnabled=this("__djCookieTest__")=="CookiesAllowed";if(navigator.cookieEnabled){this("__djCookieTest__","",{expires:-1});}}return navigator.cookieEnabled;};}if(!dojo._hasResource["dijit.tree.TreeStoreModel"]){dojo._hasResource["dijit.tree.TreeStoreModel"]=true;dojo.provide("dijit.tree.TreeStoreModel");dojo.declare("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],newItemIdAttr:"id",labelAttr:"",root:null,query:null,deferItemLoadingUntilExpand:false,constructor:function(args){dojo.mixin(this,args);this.connects=[];var _2b5=this.store;if(!_2b5.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.Tree: store must support dojo.data.Identity");}if(_2b5.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([dojo.connect(_2b5,"onNew",this,"onNewItem"),dojo.connect(_2b5,"onDelete",this,"onDeleteItem"),dojo.connect(_2b5,"onSet",this,"onSetItem")]);}},destroy:function(){dojo.forEach(this.connects,dojo.disconnect);},getRoot:function(_2b6,_2b7){if(this.root){_2b6(this.root);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_2b8){if(_2b8.length!=1){throw new Error(this.declaredClass+": query "+dojo.toJson(this.query)+" returned "+_2b8.length+" items, but must return exactly one item");}this.root=_2b8[0];_2b6(this.root);}),onError:_2b7});}},mayHaveChildren:function(item){return dojo.some(this.childrenAttrs,function(attr){return this.store.hasAttribute(item,attr);},this);},getChildren:function(_2b9,_2ba,_2bb){var _2bc=this.store;if(!_2bc.isItemLoaded(_2b9)){var _2bd=dojo.hitch(this,arguments.callee);_2bc.loadItem({item:_2b9,onItem:function(_2be){_2bd(_2be,_2ba,_2bb);},onError:_2bb});return;}var _2bf=[];for(var i=0;i<this.childrenAttrs.length;i++){var vals=_2bc.getValues(_2b9,this.childrenAttrs[i]);_2bf=_2bf.concat(vals);}var _2c0=0;if(!this.deferItemLoadingUntilExpand){dojo.forEach(_2bf,function(item){if(!_2bc.isItemLoaded(item)){_2c0++;}});}if(_2c0==0){_2ba(_2bf);}else{var _2c1=function _2c1(item){if(--_2c0==0){_2ba(_2bf);}};dojo.forEach(_2bf,function(item){if(!_2bc.isItemLoaded(item)){_2bc.loadItem({item:item,onItem:_2c1,onError:_2bb});}});}},isItem:function(_2c2){return this.store.isItem(_2c2);},fetchItemByIdentity:function(_2c3){this.store.fetchItemByIdentity(_2c3);},getIdentity:function(item){return this.store.getIdentity(item);},getLabel:function(item){if(this.labelAttr){return this.store.getValue(item,this.labelAttr);}else{return this.store.getLabel(item);}},newItem:function(args,_2c4,_2c5){var _2c6={parent:_2c4,attribute:this.childrenAttrs[0],insertIndex:_2c5};if(this.newItemIdAttr&&args[this.newItemIdAttr]){this.fetchItemByIdentity({identity:args[this.newItemIdAttr],scope:this,onItem:function(item){if(item){this.pasteItem(item,null,_2c4,true,_2c5);}else{this.store.newItem(args,_2c6);}}});}else{this.store.newItem(args,_2c6);}},pasteItem:function(_2c7,_2c8,_2c9,_2ca,_2cb){var _2cc=this.store,_2cd=this.childrenAttrs[0];if(_2c8){dojo.forEach(this.childrenAttrs,function(attr){if(_2cc.containsValue(_2c8,attr,_2c7)){if(!_2ca){var _2ce=dojo.filter(_2cc.getValues(_2c8,attr),function(x){return x!=_2c7;});_2cc.setValues(_2c8,attr,_2ce);}_2cd=attr;}});}if(_2c9){if(typeof _2cb=="number"){var _2cf=_2cc.getValues(_2c9,_2cd);_2cf.splice(_2cb,0,_2c7);_2cc.setValues(_2c9,_2cd,_2cf);}else{_2cc.setValues(_2c9,_2cd,_2cc.getValues(_2c9,_2cd).concat(_2c7));}}},onChange:function(item){},onChildrenChange:function(_2d0,_2d1){},onDelete:function(_2d2,_2d3){},onNewItem:function(item,_2d4){if(!_2d4){return;}this.getChildren(_2d4.item,dojo.hitch(this,function(_2d5){this.onChildrenChange(_2d4.item,_2d5);}));},onDeleteItem:function(item){this.onDelete(item);},onSetItem:function(item,_2d6,_2d7,_2d8){if(dojo.indexOf(this.childrenAttrs,_2d6)!=-1){this.getChildren(item,dojo.hitch(this,function(_2d9){this.onChildrenChange(item,_2d9);}));}else{this.onChange(item);}}});}if(!dojo._hasResource["dijit.tree.ForestStoreModel"]){dojo._hasResource["dijit.tree.ForestStoreModel"]=true;dojo.provide("dijit.tree.ForestStoreModel");dojo.declare("dijit.tree.ForestStoreModel",dijit.tree.TreeStoreModel,{rootId:"$root$",rootLabel:"ROOT",query:null,constructor:function(_2da){this.root={store:this,root:true,id:_2da.rootId,label:_2da.rootLabel,children:_2da.rootChildren};},mayHaveChildren:function(item){return item===this.root||this.inherited(arguments);},getChildren:function(_2db,_2dc,_2dd){if(_2db===this.root){if(this.root.children){_2dc(this.root.children);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_2de){this.root.children=_2de;_2dc(_2de);}),onError:_2dd});}}else{this.inherited(arguments);}},isItem:function(_2df){return (_2df===this.root)?true:this.inherited(arguments);},fetchItemByIdentity:function(_2e0){if(_2e0.identity==this.root.id){var _2e1=_2e0.scope?_2e0.scope:dojo.global;if(_2e0.onItem){_2e0.onItem.call(_2e1,this.root);}}else{this.inherited(arguments);}},getIdentity:function(item){return (item===this.root)?this.root.id:this.inherited(arguments);},getLabel:function(item){return (item===this.root)?this.root.label:this.inherited(arguments);},newItem:function(args,_2e2,_2e3){if(_2e2===this.root){this.onNewRootItem(args);return this.store.newItem(args);}else{return this.inherited(arguments);}},onNewRootItem:function(args){},pasteItem:function(_2e4,_2e5,_2e6,_2e7,_2e8){if(_2e5===this.root){if(!_2e7){this.onLeaveRoot(_2e4);}}dijit.tree.TreeStoreModel.prototype.pasteItem.call(this,_2e4,_2e5===this.root?null:_2e5,_2e6===this.root?null:_2e6,_2e7,_2e8);if(_2e6===this.root){this.onAddToRoot(_2e4);}},onAddToRoot:function(item){},onLeaveRoot:function(item){},_requeryTop:function(){var _2e9=this.root.children||[];this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_2ea){this.root.children=_2ea;if(_2e9.length!=_2ea.length||dojo.some(_2e9,function(item,idx){return _2ea[idx]!=item;})){this.onChildrenChange(this.root,_2ea);}})});},onNewItem:function(item,_2eb){this._requeryTop();this.inherited(arguments);},onDeleteItem:function(item){if(dojo.indexOf(this.root.children,item)!=-1){this._requeryTop();}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.Tree"]){dojo._hasResource["dijit.Tree"]=true;dojo.provide("dijit.Tree");dojo.declare("dijit._TreeNode",[dijit._Widget,dijit._Templated,dijit._Container,dijit._Contained],{item:null,isTreeNode:true,label:"",isExpandable:null,isExpanded:false,state:"UNCHECKED",templateString:dojo.cache("dijit","templates/TreeNode.html","<div class=\"dijitTreeNode\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" waiRole=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"iconNode\" class=\"dijitTreeIcon\" waiRole=\"presentation\"\n\t\t\t><span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onLabelFocus, onblur:_onLabelBlur\"></span>\n\t\t</span\n\t></div>\n\t<div dojoAttachPoint=\"containerNode\" class=\"dijitTreeContainer\" waiRole=\"presentation\" style=\"display: none;\"></div>\n</div>\n"),attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{label:{node:"labelNode",type:"innerText"},tooltip:{node:"rowNode",type:"attribute",attribute:"title"}}),postCreate:function(){this._setExpando();this._updateItemClasses(this.item);if(this.isExpandable){dijit.setWaiState(this.labelNode,"expanded",this.isExpanded);}},_setIndentAttr:function(_2ec){this.indent=_2ec;var _2ed=(Math.max(_2ec,0)*this.tree._nodePixelIndent)+"px";dojo.style(this.domNode,"backgroundPosition",_2ed+" 0px");dojo.style(this.rowNode,dojo._isBodyLtr()?"paddingLeft":"paddingRight",_2ed);dojo.forEach(this.getChildren(),function(_2ee){_2ee.attr("indent",_2ec+1);});},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(item){var tree=this.tree,_2ef=tree.model;if(tree._v10Compat&&item===_2ef.root){item=null;}this._applyClassAndStyle(item,"icon","Icon");this._applyClassAndStyle(item,"label","Label");this._applyClassAndStyle(item,"row","Row");},_applyClassAndStyle:function(item,_2f0,_2f1){var _2f2="_"+_2f0+"Class";var _2f3=_2f0+"Node";if(this[_2f2]){dojo.removeClass(this[_2f3],this[_2f2]);}this[_2f2]=this.tree["get"+_2f1+"Class"](item,this.isExpanded);if(this[_2f2]){dojo.addClass(this[_2f3],this[_2f2]);}dojo.style(this[_2f3],this.tree["get"+_2f1+"Style"](item,this.isExpanded)||{});},_updateLayout:function(){var _2f4=this.getParent();if(!_2f4||_2f4.rowNode.style.display=="none"){dojo.addClass(this.domNode,"dijitTreeIsRoot");}else{dojo.toggleClass(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_2f5){var _2f6=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_2f7=["*","-","+","*"],idx=_2f5?0:(this.isExpandable?(this.isExpanded?1:2):3);dojo.removeClass(this.expandoNode,_2f6);dojo.addClass(this.expandoNode,_2f6[idx]);this.expandoNodeText.innerHTML=_2f7[idx];},expand:function(){if(this._expandDeferred){return this._expandDeferred;}this._wipeOut&&this._wipeOut.stop();this.isExpanded=true;dijit.setWaiState(this.labelNode,"expanded","true");dijit.setWaiRole(this.containerNode,"group");dojo.addClass(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(this==this.tree.rootNode){dijit.setWaiState(this.tree.domNode,"expanded","true");}var def,_2f8=dojo.fx.wipeIn({node:this.containerNode,duration:dijit.defaultDuration,onEnd:function(){def.callback(true);}});def=(this._expandDeferred=new dojo.Deferred(function(){_2f8.stop();}));_2f8.play();return def;},collapse:function(){if(!this.isExpanded){return;}if(this._expandDeferred){this._expandDeferred.cancel();delete this._expandDeferred;}this.isExpanded=false;dijit.setWaiState(this.labelNode,"expanded","false");if(this==this.tree.rootNode){dijit.setWaiState(this.tree.domNode,"expanded","false");}dojo.removeClass(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(!this._wipeOut){this._wipeOut=dojo.fx.wipeOut({node:this.containerNode,duration:dijit.defaultDuration});}this._wipeOut.play();},indent:0,setChildItems:function(_2f9){var tree=this.tree,_2fa=tree.model,defs=[];this.getChildren().forEach(function(_2fb){dijit._Container.prototype.removeChild.call(this,_2fb);},this);this.state="LOADED";if(_2f9&&_2f9.length>0){this.isExpandable=true;dojo.forEach(_2f9,function(item){var id=_2fa.getIdentity(item),_2fc=tree._itemNodesMap[id],node;if(_2fc){for(var i=0;i<_2fc.length;i++){if(_2fc[i]&&!_2fc[i].getParent()){node=_2fc[i];node.attr("indent",this.indent+1);break;}}}if(!node){node=this.tree._createTreeNode({item:item,tree:tree,isExpandable:_2fa.mayHaveChildren(item),label:tree.getLabel(item),tooltip:tree.getTooltip(item),indent:this.indent+1});if(_2fc){_2fc.push(node);}else{tree._itemNodesMap[id]=[node];}}this.addChild(node);if(this.tree.autoExpand||this.tree._state(item)){defs.push(tree._expandNode(node));}},this);dojo.forEach(this.getChildren(),function(_2fd,idx){_2fd._updateLayout();});}else{this.isExpandable=false;}if(this._setExpando){this._setExpando(false);}if(this==tree.rootNode){var fc=this.tree.showRoot?this:this.getChildren()[0];if(fc){fc.setSelected(true);tree.lastFocused=fc;}else{tree.domNode.setAttribute("tabIndex","0");}}return new dojo.DeferredList(defs);},removeChild:function(node){this.inherited(arguments);var _2fe=this.getChildren();if(_2fe.length==0){this.isExpandable=false;this.collapse();}dojo.forEach(_2fe,function(_2ff){_2ff._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},_onLabelFocus:function(evt){dojo.addClass(this.labelNode,"dijitTreeLabelFocused");this.tree._onNodeFocus(this);},_onLabelBlur:function(evt){dojo.removeClass(this.labelNode,"dijitTreeLabelFocused");},setSelected:function(_300){var _301=this.labelNode;_301.setAttribute("tabIndex",_300?"0":"-1");dijit.setWaiState(_301,"selected",_300);dojo.toggleClass(this.rowNode,"dijitTreeNodeSelected",_300);},_onClick:function(evt){this.tree._onClick(this,evt);},_onDblClick:function(evt){this.tree._onDblClick(this,evt);},_onMouseEnter:function(evt){dojo.addClass(this.rowNode,"dijitTreeNodeHover");this.tree._onNodeMouseEnter(this,evt);},_onMouseLeave:function(evt){dojo.removeClass(this.rowNode,"dijitTreeNodeHover");this.tree._onNodeMouseLeave(this,evt);}});dojo.declare("dijit.Tree",[dijit._Widget,dijit._Templated],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],path:[],selectedItem:null,openOnClick:false,openOnDblClick:false,templateString:dojo.cache("dijit","templates/Tree.html","<div class=\"dijitTree dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" dojoAttachPoint=\"indentDetector\"></div>\n</div>\n"),persist:true,autoExpand:false,dndController:null,dndParams:["onDndDrop","itemCreator","onDndCancel","checkAcceptance","checkItemAcceptance","dragThreshold","betweenThreshold"],onDndDrop:null,itemCreator:null,onDndCancel:null,checkAcceptance:null,checkItemAcceptance:null,dragThreshold:5,betweenThreshold:0,_nodePixelIndent:19,_publish:function(_302,_303){dojo.publish(this.id,[dojo.mixin({tree:this,event:_302},_303||{})]);},postMixInProperties:function(){this.tree=this;this._itemNodesMap={};if(!this.cookieName){this.cookieName=this.id+"SaveStateCookie";}this._loadDeferred=new dojo.Deferred();this.inherited(arguments);},postCreate:function(){this._initState();if(!this.model){this._store2model();}this.connect(this.model,"onChange","_onItemChange");this.connect(this.model,"onChildrenChange","_onItemChildrenChange");this.connect(this.model,"onDelete","_onItemDelete");this._load();this.inherited(arguments);if(this.dndController){if(dojo.isString(this.dndController)){this.dndController=dojo.getObject(this.dndController);}var _304={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_304[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_304);}},_store2model:function(){this._v10Compat=true;dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _305={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_305.mayHaveChildren=dojo.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_305.getChildren=dojo.hitch(this,function(item,_306,_307){this.getItemChildren((this._v10Compat&&item===this.model.root)?null:item,_306,_307);});}this.model=new dijit.tree.ForestStoreModel(_305);this.showRoot=Boolean(this.label);},onLoad:function(){},_load:function(){this.model.getRoot(dojo.hitch(this,function(item){var rn=(this.rootNode=this.tree._createTreeNode({item:item,tree:this,isExpandable:true,label:this.label||this.getLabel(item),indent:this.showRoot?0:-1}));if(!this.showRoot){rn.rowNode.style.display="none";}this.domNode.appendChild(rn.domNode);var _308=this.model.getIdentity(item);if(this._itemNodesMap[_308]){this._itemNodesMap[_308].push(rn);}else{this._itemNodesMap[_308]=[rn];}rn._updateLayout();this._expandNode(rn).addCallback(dojo.hitch(this,function(){this._loadDeferred.callback(true);this.onLoad();}));}),function(err){console.error(this,": error loading root: ",err);});},getNodesByItem:function(item){if(!item){return [];}var _309=dojo.isString(item)?item:this.model.getIdentity(item);return [].concat(this._itemNodesMap[_309]);},_setSelectedItemAttr:function(item){var _30a=this.attr("selectedItem");var _30b=(!item||dojo.isString(item))?item:this.model.getIdentity(item);if(_30b==_30a?this.model.getIdentity(_30a):null){return;}var _30c=this._itemNodesMap[_30b];if(_30c&&_30c.length){this.focusNode(_30c[0]);}else{if(this.lastFocused){this.lastFocused.setSelected(false);this.lastFocused=null;}}},_getSelectedItemAttr:function(){return this.lastFocused&&this.lastFocused.item;},_setPathAttr:function(path){if(!path||!path.length){return;}this._loadDeferred.addCallback(dojo.hitch(this,function(){if(!this.rootNode){return;}if(path[0]!==this.rootNode.item&&(dojo.isString(path[0])&&path[0]!=this.model.getIdentity(this.rootNode.item))){console.error(this,":path[0] doesn't match this.rootNode.item.  Maybe you are using the wrong tree.");return;}path.shift();var node=this.rootNode;function _30d(){var item=path.shift(),_30e=dojo.isString(item)?item:this.model.getIdentity(item);dojo.some(this._itemNodesMap[_30e],function(n){if(n.getParent()==node){node=n;return true;}return false;});if(path.length){this._expandNode(node).addCallback(dojo.hitch(this,_30d));}else{if(this.lastFocused!=node){this.focusNode(node);}}};this._expandNode(node).addCallback(dojo.hitch(this,_30d));}));},_getPathAttr:function(){if(!this.lastFocused){return;}var res=[];var _30f=this.lastFocused;while(_30f&&_30f!==this.rootNode){res.unshift(_30f.item);_30f=_30f.getParent();}res.unshift(this.rootNode.item);return res;},mayHaveChildren:function(item){},getItemChildren:function(_310,_311){},getLabel:function(item){return this.model.getLabel(item);},getIconClass:function(item,_312){return (!item||this.model.mayHaveChildren(item))?(_312?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(item,_313){},getRowClass:function(item,_314){},getIconStyle:function(item,_315){},getLabelStyle:function(item,_316){},getRowStyle:function(item,_317){},getTooltip:function(item){return "";},_onKeyPress:function(e){if(e.altKey){return;}var dk=dojo.keys;var _318=dijit.getEnclosingWidget(e.target);if(!_318){return;}var key=e.charOrCode;if(typeof key=="string"){if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){this._onLetterKeyNav({node:_318,key:key.toLowerCase()});dojo.stopEvent(e);}}else{if(this._curSearch){clearTimeout(this._curSearch.timer);delete this._curSearch;}var map=this._keyHandlerMap;if(!map){map={};map[dk.ENTER]="_onEnterKey";map[this.isLeftToRight()?dk.LEFT_ARROW:dk.RIGHT_ARROW]="_onLeftArrow";map[this.isLeftToRight()?dk.RIGHT_ARROW:dk.LEFT_ARROW]="_onRightArrow";map[dk.UP_ARROW]="_onUpArrow";map[dk.DOWN_ARROW]="_onDownArrow";map[dk.HOME]="_onHomeKey";map[dk.END]="_onEndKey";this._keyHandlerMap=map;}if(this._keyHandlerMap[key]){this[this._keyHandlerMap[key]]({node:_318,item:_318.item,evt:e});dojo.stopEvent(e);}}},_onEnterKey:function(_319,evt){this._publish("execute",{item:_319.item,node:_319.node});this.onClick(_319.item,_319.node,evt);},_onDownArrow:function(_31a){var node=this._getNextNode(_31a.node);if(node&&node.isTreeNode){this.focusNode(node);}},_onUpArrow:function(_31b){var node=_31b.node;var _31c=node.getPreviousSibling();if(_31c){node=_31c;while(node.isExpandable&&node.isExpanded&&node.hasChildren()){var _31d=node.getChildren();node=_31d[_31d.length-1];}}else{var _31e=node.getParent();if(!(!this.showRoot&&_31e===this.rootNode)){node=_31e;}}if(node&&node.isTreeNode){this.focusNode(node);}},_onRightArrow:function(_31f){var node=_31f.node;if(node.isExpandable&&!node.isExpanded){this._expandNode(node);}else{if(node.hasChildren()){node=node.getChildren()[0];if(node&&node.isTreeNode){this.focusNode(node);}}}},_onLeftArrow:function(_320){var node=_320.node;if(node.isExpandable&&node.isExpanded){this._collapseNode(node);}else{var _321=node.getParent();if(_321&&_321.isTreeNode&&!(!this.showRoot&&_321===this.rootNode)){this.focusNode(_321);}}},_onHomeKey:function(){var node=this._getRootOrFirstNode();if(node){this.focusNode(node);}},_onEndKey:function(_322){var node=this.rootNode;while(node.isExpanded){var c=node.getChildren();node=c[c.length-1];}if(node&&node.isTreeNode){this.focusNode(node);}},multiCharSearchDuration:250,_onLetterKeyNav:function(_323){var cs=this._curSearch;if(cs){cs.pattern=cs.pattern+_323.key;clearTimeout(cs.timer);}else{cs=this._curSearch={pattern:_323.key,startNode:_323.node};}var self=this;cs.timer=setTimeout(function(){delete self._curSearch;},this.multiCharSearchDuration);var node=cs.startNode;do{node=this._getNextNode(node);if(!node){node=this._getRootOrFirstNode();}}while(node!==cs.startNode&&(node.label.toLowerCase().substr(0,cs.pattern.length)!=cs.pattern));if(node&&node.isTreeNode){if(node!==cs.startNode){this.focusNode(node);}}},_onClick:function(_324,e){var _325=e.target;if((this.openOnClick&&_324.isExpandable)||(_325==_324.expandoNode||_325==_324.expandoNodeText)){if(_324.isExpandable){this._onExpandoClick({node:_324});}}else{this._publish("execute",{item:_324.item,node:_324,evt:e});this.onClick(_324.item,_324,e);this.focusNode(_324);}dojo.stopEvent(e);},_onDblClick:function(_326,e){var _327=e.target;if((this.openOnDblClick&&_326.isExpandable)||(_327==_326.expandoNode||_327==_326.expandoNodeText)){if(_326.isExpandable){this._onExpandoClick({node:_326});}}else{this._publish("execute",{item:_326.item,node:_326,evt:e});this.onDblClick(_326.item,_326,e);this.focusNode(_326);}dojo.stopEvent(e);},_onExpandoClick:function(_328){var node=_328.node;this.focusNode(node);if(node.isExpanded){this._collapseNode(node);}else{this._expandNode(node);}},onClick:function(item,node,evt){},onDblClick:function(item,node,evt){},onOpen:function(item,node){},onClose:function(item,node){},_getNextNode:function(node){if(node.isExpandable&&node.isExpanded&&node.hasChildren()){return node.getChildren()[0];}else{while(node&&node.isTreeNode){var _329=node.getNextSibling();if(_329){return _329;}node=node.getParent();}return null;}},_getRootOrFirstNode:function(){return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];},_collapseNode:function(node){if(node._expandNodeDeferred){delete node._expandNodeDeferred;}if(node.isExpandable){if(node.state=="LOADING"){return;}node.collapse();this.onClose(node.item,node);if(node.item){this._state(node.item,false);this._saveState();}}},_expandNode:function(node,_32a){if(node._expandNodeDeferred&&!_32a){return node._expandNodeDeferred;}var _32b=this.model,item=node.item,_32c=this;switch(node.state){case "UNCHECKED":node.markProcessing();var def=(node._expandNodeDeferred=new dojo.Deferred());_32b.getChildren(item,function(_32d){node.unmarkProcessing();var scid=node.setChildItems(_32d);var ed=_32c._expandNode(node,true);scid.addCallback(function(){ed.addCallback(function(){def.callback();});});},function(err){console.error(_32c,": error loading root children: ",err);});break;default:def=(node._expandNodeDeferred=node.expand());this.onOpen(node.item,node);if(item){this._state(item,true);this._saveState();}}return def;},focusNode:function(node){dijit.focus(node.labelNode);},_onNodeFocus:function(node){if(node){if(node!=this.lastFocused&&this.lastFocused&&!this.lastFocused._destroyed){this.lastFocused.setSelected(false);}node.setSelected(true);this.lastFocused=node;}},_onNodeMouseEnter:function(node){},_onNodeMouseLeave:function(node){},_onItemChange:function(item){var _32e=this.model,_32f=_32e.getIdentity(item),_330=this._itemNodesMap[_32f];if(_330){var self=this;dojo.forEach(_330,function(node){node.attr({label:self.getLabel(item),tooltip:self.getTooltip(item)});node._updateItemClasses(item);});}},_onItemChildrenChange:function(_331,_332){var _333=this.model,_334=_333.getIdentity(_331),_335=this._itemNodesMap[_334];if(_335){dojo.forEach(_335,function(_336){_336.setChildItems(_332);});}},_onItemDelete:function(item){var _337=this.model,_338=_337.getIdentity(item),_339=this._itemNodesMap[_338];if(_339){dojo.forEach(_339,function(node){var _33a=node.getParent();if(_33a){_33a.removeChild(node);}node.destroyRecursive();});delete this._itemNodesMap[_338];}},_initState:function(){if(this.persist){var _33b=dojo.cookie(this.cookieName);this._openedItemIds={};if(_33b){dojo.forEach(_33b.split(","),function(item){this._openedItemIds[item]=true;},this);}}},_state:function(item,_33c){if(!this.persist){return false;}var id=this.model.getIdentity(item);if(arguments.length===1){return this._openedItemIds[id];}if(_33c){this._openedItemIds[id]=true;}else{delete this._openedItemIds[id];}},_saveState:function(){if(!this.persist){return;}var ary=[];for(var id in this._openedItemIds){ary.push(id);}dojo.cookie(this.cookieName,ary.join(","),{expires:365});},destroy:function(){if(this._curSearch){clearTimeout(this._curSearch.timer);delete this._curSearch;}if(this.rootNode){this.rootNode.destroyRecursive();}if(this.dndController&&!dojo.isString(this.dndController)){this.dndController.destroy();}this.rootNode=null;this.inherited(arguments);},destroyRecursive:function(){this.destroy();},resize:function(_33d){if(_33d){dojo.marginBox(this.domNode,_33d);dojo.style(this.domNode,"overflow","auto");}this._nodePixelIndent=dojo.marginBox(this.tree.indentDetector).w;if(this.tree.rootNode){this.tree.rootNode.attr("indent",this.showRoot?0:-1);}},_createTreeNode:function(args){return new dijit._TreeNode(args);}});}if(!dojo._hasResource["dijit.form.TextBox"]){dojo._hasResource["dijit.form.TextBox"]=true;dojo.provide("dijit.form.TextBox");dojo.declare("dijit.form.TextBox",dijit.form._FormValueWidget,{trim:false,uppercase:false,lowercase:false,propercase:false,maxLength:"",selectOnClick:false,templateString:dojo.cache("dijit.form","templates/TextBox.html","<input class=\"dijit dijitReset dijitLeft\" dojoAttachPoint='textbox,focusNode'\n\tdojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse'\n\tautocomplete=\"off\" type=\"${type}\" ${nameAttrSetting}\n\t/>\n"),baseClass:"dijitTextBox",attributeMap:dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap,{maxLength:"focusNode"}),_getValueAttr:function(){return this.parse(this.attr("displayedValue"),this.constraints);},_setValueAttr:function(_33e,_33f,_340){var _341;if(_33e!==undefined){_341=this.filter(_33e);if(typeof _340!="string"){if(_341!==null&&((typeof _341!="number")||!isNaN(_341))){_340=this.filter(this.format(_341,this.constraints));}else{_340="";}}}if(_340!=null&&_340!=undefined&&((typeof _340)!="number"||!isNaN(_340))&&this.textbox.value!=_340){this.textbox.value=_340;}this.inherited(arguments,[_341,_33f]);},displayedValue:"",getDisplayedValue:function(){dojo.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use attr('displayedValue') instead.","","2.0");return this.attr("displayedValue");},_getDisplayedValueAttr:function(){return this.filter(this.textbox.value);},setDisplayedValue:function(_342){dojo.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use attr('displayedValue', ...) instead.","","2.0");this.attr("displayedValue",_342);},_setDisplayedValueAttr:function(_343){if(_343===null||_343===undefined){_343="";}else{if(typeof _343!="string"){_343=String(_343);}}this.textbox.value=_343;this._setValueAttr(this.attr("value"),undefined,_343);},format:function(_344,_345){return ((_344==null||_344==undefined)?"":(_344.toString?_344.toString():_344));},parse:function(_346,_347){return _346;},_refreshState:function(){},_onInput:function(e){if(e&&e.type&&/key/i.test(e.type)&&e.keyCode){switch(e.keyCode){case dojo.keys.SHIFT:case dojo.keys.ALT:case dojo.keys.CTRL:case dojo.keys.TAB:return;}}if(this.intermediateChanges){var _348=this;setTimeout(function(){_348._handleOnChange(_348.attr("value"),false);},0);}this._refreshState();},postCreate:function(){this.textbox.setAttribute("value",this.textbox.value);this.inherited(arguments);if(dojo.isMoz||dojo.isOpera){this.connect(this.textbox,"oninput",this._onInput);}else{this.connect(this.textbox,"onkeydown",this._onInput);this.connect(this.textbox,"onkeyup",this._onInput);this.connect(this.textbox,"onpaste",this._onInput);this.connect(this.textbox,"oncut",this._onInput);}},_blankValue:"",filter:function(val){if(val===null){return this._blankValue;}if(typeof val!="string"){return val;}if(this.trim){val=dojo.trim(val);}if(this.uppercase){val=val.toUpperCase();}if(this.lowercase){val=val.toLowerCase();}if(this.propercase){val=val.replace(/[^\s]+/g,function(word){return word.substring(0,1).toUpperCase()+word.substring(1);});}return val;},_setBlurValue:function(){this._setValueAttr(this.attr("value"),true);},_onBlur:function(e){if(this.disabled){return;}this._setBlurValue();this.inherited(arguments);if(this._selectOnClickHandle){this.disconnect(this._selectOnClickHandle);}if(this.selectOnClick&&dojo.isMoz){this.textbox.selectionStart=this.textbox.selectionEnd=undefined;}},_onFocus:function(by){if(this.disabled||this.readOnly){return;}if(this.selectOnClick&&by=="mouse"){this._selectOnClickHandle=this.connect(this.domNode,"onmouseup",function(){this.disconnect(this._selectOnClickHandle);var _349;if(dojo.isIE){var _34a=dojo.doc.selection.createRange();var _34b=_34a.parentElement();_349=_34b==this.textbox&&_34a.text.length==0;}else{_349=this.textbox.selectionStart==this.textbox.selectionEnd;}if(_349){dijit.selectInputText(this.textbox);}});}this._refreshState();this.inherited(arguments);},reset:function(){this.textbox.value="";this.inherited(arguments);}});dijit.selectInputText=function(_34c,_34d,stop){var _34e=dojo.global;var _34f=dojo.doc;_34c=dojo.byId(_34c);if(isNaN(_34d)){_34d=0;}if(isNaN(stop)){stop=_34c.value?_34c.value.length:0;}dijit.focus(_34c);if(_34f["selection"]&&dojo.body()["createTextRange"]){if(_34c.createTextRange){var _350=_34c.createTextRange();with(_350){collapse(true);moveStart("character",-99999);moveStart("character",_34d);moveEnd("character",stop-_34d);select();}}}else{if(_34e["getSelection"]){if(_34c.setSelectionRange){_34c.setSelectionRange(_34d,stop);}}}};}if(!dojo._hasResource["dijit.InlineEditBox"]){dojo._hasResource["dijit.InlineEditBox"]=true;dojo.provide("dijit.InlineEditBox");dojo.declare("dijit.InlineEditBox",dijit._Widget,{editing:false,autoSave:true,buttonSave:"",buttonCancel:"",renderAsHtml:false,editor:"dijit.form.TextBox",editorWrapper:"dijit._InlineEditor",editorParams:{},onChange:function(_351){},onCancel:function(){},width:"100%",value:"",noValueIndicator:"<span style='font-family: wingdings; text-decoration: underline;'>&nbsp;&nbsp;&nbsp;&nbsp;&#x270d;&nbsp;&nbsp;&nbsp;&nbsp;</span>",constructor:function(){this.editorParams={};},postMixInProperties:function(){this.inherited(arguments);this.displayNode=this.srcNodeRef;var _352={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};for(var name in _352){this.connect(this.displayNode,name,_352[name]);}dijit.setWaiRole(this.displayNode,"button");if(!this.displayNode.getAttribute("tabIndex")){this.displayNode.setAttribute("tabIndex",0);}this.attr("value",this.value||this.displayNode.innerHTML);},setDisabled:function(_353){dojo.deprecated("dijit.InlineEditBox.setDisabled() is deprecated.  Use attr('disabled', bool) instead.","","2.0");this.attr("disabled",_353);},_setDisabledAttr:function(_354){this.disabled=_354;dijit.setWaiState(this.domNode,"disabled",_354);if(_354){this.displayNode.removeAttribute("tabIndex");}else{this.displayNode.setAttribute("tabIndex",0);}},_onMouseOver:function(){dojo.addClass(this.displayNode,this.disabled?"dijitDisabledClickableRegion":"dijitClickableRegion");},_onMouseOut:function(){dojo.removeClass(this.displayNode,this.disabled?"dijitDisabledClickableRegion":"dijitClickableRegion");},_onClick:function(e){if(this.disabled){return;}if(e){dojo.stopEvent(e);}this._onMouseOut();setTimeout(dojo.hitch(this,"edit"),0);},edit:function(){if(this.disabled||this.editing){return;}this.editing=true;this._savedPosition=dojo.style(this.displayNode,"position")||"static";this._savedOpacity=dojo.style(this.displayNode,"opacity")||"1";this._savedTabIndex=dojo.attr(this.displayNode,"tabIndex")||"0";if(this.wrapperWidget){this.wrapperWidget.editWidget.attr("displayedValue" in this.editorParams?"displayedValue":"value",this.value);}else{var _355=dojo.create("span",null,this.domNode,"before");var ewc=dojo.getObject(this.editorWrapper);this.wrapperWidget=new ewc({value:this.value,buttonSave:this.buttonSave,buttonCancel:this.buttonCancel,tabIndex:this._savedTabIndex,editor:this.editor,inlineEditBox:this,sourceStyle:dojo.getComputedStyle(this.displayNode),save:dojo.hitch(this,"save"),cancel:dojo.hitch(this,"cancel")},_355);}var ww=this.wrapperWidget;if(dojo.isIE){dijit.focus(dijit.getFocus());}dojo.style(this.displayNode,{position:"absolute",opacity:"0",display:"none"});dojo.style(ww.domNode,{position:this._savedPosition,visibility:"visible",opacity:"1"});dojo.attr(this.displayNode,"tabIndex","-1");setTimeout(dojo.hitch(this,function(){ww.focus();ww._resetValue=ww.getValue();}),0);},_onBlur:function(){this.inherited(arguments);if(!this.editing){setTimeout(dojo.hitch(this,function(){if(this.wrapperWidget){this.wrapperWidget.destroy();delete this.wrapperWidget;}}),0);}},_showText:function(_356){var ww=this.wrapperWidget;dojo.style(ww.domNode,{position:"absolute",visibility:"hidden",opacity:"0"});dojo.style(this.displayNode,{position:this._savedPosition,opacity:this._savedOpacity,display:""});dojo.attr(this.displayNode,"tabIndex",this._savedTabIndex);if(_356){dijit.focus(this.displayNode);}},save:function(_357){if(this.disabled||!this.editing){return;}this.editing=false;var ww=this.wrapperWidget;var _358=ww.getValue();this.attr("value",_358);setTimeout(dojo.hitch(this,"onChange",_358),0);this._showText(_357);},setValue:function(val){dojo.deprecated("dijit.InlineEditBox.setValue() is deprecated.  Use attr('value', ...) instead.","","2.0");return this.attr("value",val);},_setValueAttr:function(val){this.value=val=dojo.trim(val);if(!this.renderAsHtml){val=val.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;").replace(/\n/g,"<br>");}this.displayNode.innerHTML=val||this.noValueIndicator;},getValue:function(){dojo.deprecated("dijit.InlineEditBox.getValue() is deprecated.  Use attr('value') instead.","","2.0");return this.attr("value");},cancel:function(_359){if(this.disabled||!this.editing){return;}this.editing=false;setTimeout(dojo.hitch(this,"onCancel"),0);this._showText(_359);}});dojo.declare("dijit._InlineEditor",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dijit","templates/InlineEditBox.html","<span dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\"\n\t><span dojoAttachPoint=\"editorPlaceholder\"></span\n\t><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" label=\"${buttonSave}\"></button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\" label=\"${buttonCancel}\"></button\n\t></span\n></span>\n"),widgetsInTemplate:true,postMixInProperties:function(){this.inherited(arguments);this.messages=dojo.i18n.getLocalization("dijit","common",this.lang);dojo.forEach(["buttonSave","buttonCancel"],function(prop){if(!this[prop]){this[prop]=this.messages[prop];}},this);},postCreate:function(){var cls=dojo.getObject(this.editor);var _35a=this.sourceStyle;var _35b="line-height:"+_35a.lineHeight+";";dojo.forEach(["Weight","Family","Size","Style"],function(prop){_35b+="font-"+prop+":"+_35a["font"+prop]+";";},this);dojo.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(prop){this.domNode.style[prop]=_35a[prop];},this);var _35c=this.inlineEditBox.width;if(_35c=="100%"){_35b+="width:100%;";this.domNode.style.display="block";}else{_35b+="width:"+(_35c+(Number(_35c)==_35c?"px":""))+";";}var _35d=this.inlineEditBox.editorParams;_35d.style=_35b;_35d["displayedValue" in cls.prototype?"displayedValue":"value"]=this.value;var ew=this.editWidget=new cls(_35d,this.editorPlaceholder);if(this.inlineEditBox.autoSave){this.buttonContainer.style.display="none";this.connect(ew,"onChange","_onChange");this.connect(ew,"onKeyPress","_onKeyPress");}else{if("intermediateChanges" in cls.prototype){ew.attr("intermediateChanges",true);this.connect(ew,"onChange","_onIntermediateChange");this.saveButton.attr("disabled",true);}}},_onIntermediateChange:function(val){this.saveButton.attr("disabled",(this.getValue()==this._resetValue)||!this.enableSave());},destroy:function(){this.editWidget.destroy(true);this.inherited(arguments);},getValue:function(){var ew=this.editWidget;return String(ew.attr("displayedValue" in ew?"displayedValue":"value"));},_onKeyPress:function(e){if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing){if(e.altKey||e.ctrlKey){return;}if(e.charOrCode==dojo.keys.ESCAPE){dojo.stopEvent(e);this.cancel(true);}else{if(e.charOrCode==dojo.keys.ENTER&&e.target.tagName=="INPUT"){dojo.stopEvent(e);this._onChange();}}}},_onBlur:function(){this.inherited(arguments);if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing){if(this.getValue()==this._resetValue){this.cancel(false);}else{if(this.enableSave()){this.save(false);}}}},_onChange:function(){if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing&&this.enableSave()){dojo.style(this.inlineEditBox.displayNode,{display:""});dijit.focus(this.inlineEditBox.displayNode);}},enableSave:function(){return (this.editWidget.isValid?this.editWidget.isValid():true);},focus:function(){this.editWidget.focus();setTimeout(dojo.hitch(this,function(){if(this.editWidget.focusNode.tagName=="INPUT"){dijit.selectInputText(this.editWidget.focusNode);}}),0);}});}if(!dojo._hasResource["dijit.form.Form"]){dojo._hasResource["dijit.form.Form"]=true;dojo.provide("dijit.form.Form");dojo.declare("dijit.form.Form",[dijit._Widget,dijit._Templated,dijit.form._FormMixin],{name:"",action:"",method:"",encType:"","accept-charset":"",accept:"",target:"",templateString:"<form dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' ${nameAttrSetting}></form>",attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{action:"",method:"",encType:"","accept-charset":"",accept:"",target:""}),postMixInProperties:function(){this.nameAttrSetting=this.name?("name='"+this.name+"'"):"";this.inherited(arguments);},execute:function(_35e){},onExecute:function(){},_setEncTypeAttr:function(_35f){this.encType=_35f;dojo.attr(this.domNode,"encType",_35f);if(dojo.isIE){this.domNode.encoding=_35f;}},postCreate:function(){if(dojo.isIE&&this.srcNodeRef&&this.srcNodeRef.attributes){var item=this.srcNodeRef.attributes.getNamedItem("encType");if(item&&!item.specified&&(typeof item.value=="string")){this.attr("encType",item.value);}}this.inherited(arguments);},onReset:function(e){return true;},_onReset:function(e){var faux={returnValue:true,preventDefault:function(){this.returnValue=false;},stopPropagation:function(){},currentTarget:e.currentTarget,target:e.target};if(!(this.onReset(faux)===false)&&faux.returnValue){this.reset();}dojo.stopEvent(e);return false;},_onSubmit:function(e){var fp=dijit.form.Form.prototype;if(this.execute!=fp.execute||this.onExecute!=fp.onExecute){dojo.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.","","2.0");this.onExecute();this.execute(this.getValues());}if(this.onSubmit(e)===false){dojo.stopEvent(e);}},onSubmit:function(e){return this.isValid();},submit:function(){if(!(this.onSubmit()===false)){this.containerNode.submit();}}});}if(!dojo._hasResource["dijit.form.DropDownButton"]){dojo._hasResource["dijit.form.DropDownButton"]=true;dojo.provide("dijit.form.DropDownButton");}if(!dojo._hasResource["dijit.form.ComboButton"]){dojo._hasResource["dijit.form.ComboButton"]=true;dojo.provide("dijit.form.ComboButton");}if(!dojo._hasResource["dijit.form.ToggleButton"]){dojo._hasResource["dijit.form.ToggleButton"]=true;dojo.provide("dijit.form.ToggleButton");}if(!dojo._hasResource["dijit.form.CheckBox"]){dojo._hasResource["dijit.form.CheckBox"]=true;dojo.provide("dijit.form.CheckBox");dojo.declare("dijit.form.CheckBox",dijit.form.ToggleButton,{templateString:dojo.cache("dijit.form","templates/CheckBox.html","<div class=\"dijitReset dijitInline\" waiRole=\"presentation\"\n\t><input\n\t \t${nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\"\n/></div>\n"),baseClass:"dijitCheckBox",type:"checkbox",value:"on",readOnly:false,attributeMap:dojo.delegate(dijit.form.ToggleButton.prototype.attributeMap,{readOnly:"focusNode"}),_setReadOnlyAttr:function(_360){this.readOnly=_360;dojo.attr(this.focusNode,"readOnly",_360);dijit.setWaiState(this.focusNode,"readonly",_360);this._setStateClass();},_setValueAttr:function(_361){if(typeof _361=="string"){this.value=_361;dojo.attr(this.focusNode,"value",_361);_361=true;}if(this._created){this.attr("checked",_361);}},_getValueAttr:function(){return (this.checked?this.value:false);},postMixInProperties:function(){if(this.value==""){this.value="on";}this.checkedAttrSetting=this.checked?"checked":"";this.inherited(arguments);},_fillContent:function(_362){},reset:function(){this._hasBeenBlurred=false;this.attr("checked",this.params.checked||false);this.value=this.params.value||"on";dojo.attr(this.focusNode,"value",this.value);},_onFocus:function(){if(this.id){dojo.query("label[for='"+this.id+"']").addClass("dijitFocusedLabel");}},_onBlur:function(){if(this.id){dojo.query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");}},_onClick:function(e){if(this.readOnly){return false;}return this.inherited(arguments);}});dojo.declare("dijit.form.RadioButton",dijit.form.CheckBox,{type:"radio",baseClass:"dijitRadio",_setCheckedAttr:function(_363){this.inherited(arguments);if(!this._created){return;}if(_363){var _364=this;dojo.query("INPUT[type=radio]",this.focusNode.form||dojo.doc).forEach(function(_365){if(_365.name==_364.name&&_365!=_364.focusNode&&_365.form==_364.focusNode.form){var _366=dijit.getEnclosingWidget(_365);if(_366&&_366.checked){_366.attr("checked",false);}}});}},_clicked:function(e){if(!this.checked){this.attr("checked",true);}}});}if(!dojo._hasResource["dijit.form.RadioButton"]){dojo._hasResource["dijit.form.RadioButton"]=true;dojo.provide("dijit.form.RadioButton");}if(!dojo._hasResource["dijit.form.ValidationTextBox"]){dojo._hasResource["dijit.form.ValidationTextBox"]=true;dojo.provide("dijit.form.ValidationTextBox");dojo.declare("dijit.form.ValidationTextBox",dijit.form.TextBox,{templateString:dojo.cache("dijit.form","templates/ValidationTextBox.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class=\"dijitReset\" dojoAttachPoint='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${nameAttrSetting} type='${type}'\n\t\t/></div\n\t></div\n></div>\n"),baseClass:"dijitTextBox",required:false,promptMessage:"",invalidMessage:"$_unset_$",constraints:{},regExp:".*",regExpGen:function(_367){return this.regExp;},state:"",tooltipPosition:[],_setValueAttr:function(){this.inherited(arguments);this.validate(this._focused);},validator:function(_368,_369){return (new RegExp("^(?:"+this.regExpGen(_369)+")"+(this.required?"":"?")+"$")).test(_368)&&(!this.required||!this._isEmpty(_368))&&(this._isEmpty(_368)||this.parse(_368,_369)!==undefined);},_isValidSubset:function(){return this.textbox.value.search(this._partialre)==0;},isValid:function(_36a){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_36b){return /^\s*$/.test(_36b);},getErrorMessage:function(_36c){return this.invalidMessage;},getPromptMessage:function(_36d){return this.promptMessage;},_maskValidSubsetError:true,validate:function(_36e){var _36f="";var _370=this.disabled||this.isValid(_36e);if(_370){this._maskValidSubsetError=true;}var _371=!_370&&_36e&&this._isValidSubset();var _372=this._isEmpty(this.textbox.value);if(_372){this._maskValidSubsetError=true;}this.state=(_370||(!this._hasBeenBlurred&&_372)||_371)?"":"Error";if(this.state=="Error"){this._maskValidSubsetError=false;}this._setStateClass();dijit.setWaiState(this.focusNode,"invalid",_370?"false":"true");if(_36e){if(_372){_36f=this.getPromptMessage(true);}if(!_36f&&(this.state=="Error"||(_371&&!this._maskValidSubsetError))){_36f=this.getErrorMessage(true);}}this.displayMessage(_36f);return _370;},_message:"",displayMessage:function(_373){if(this._message==_373){return;}this._message=_373;dijit.hideTooltip(this.domNode);if(_373){dijit.showTooltip(_373,this.domNode,this.tooltipPosition);}},_refreshState:function(){this.validate(this._focused);this.inherited(arguments);},constructor:function(){this.constraints={};},postMixInProperties:function(){this.inherited(arguments);this.constraints.locale=this.lang;this.messages=dojo.i18n.getLocalization("dijit.form","validate",this.lang);if(this.invalidMessage=="$_unset_$"){this.invalidMessage=this.messages.invalidMessage;}var p=this.regExpGen(this.constraints);this.regExp=p;var _374="";if(p!=".*"){this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){switch(re.charAt(0)){case "{":case "+":case "?":case "*":case "^":case "$":case "|":case "(":_374+=re;break;case ")":_374+="|$)";break;default:_374+="(?:"+re+"|$)";break;}});}try{"".search(_374);}catch(e){_374=this.regExp;console.warn("RegExp error in "+this.declaredClass+": "+this.regExp);}this._partialre="^(?:"+_374+")$";},_setDisabledAttr:function(_375){this.inherited(arguments);this._refreshState();},_setRequiredAttr:function(_376){this.required=_376;dijit.setWaiState(this.focusNode,"required",_376);this._refreshState();},postCreate:function(){if(dojo.isIE){var s=dojo.getComputedStyle(this.focusNode);if(s){var ff=s.fontFamily;if(ff){this.focusNode.style.fontFamily=ff;}}}this.inherited(arguments);},reset:function(){this._maskValidSubsetError=true;this.inherited(arguments);},_onBlur:function(){this.displayMessage("");this.inherited(arguments);}});dojo.declare("dijit.form.MappedTextBox",dijit.form.ValidationTextBox,{postMixInProperties:function(){this.inherited(arguments);this.nameAttrSetting="";},serialize:function(val,_377){return val.toString?val.toString():"";},toString:function(){var val=this.filter(this.attr("value"));return val!=null?(typeof val=="string"?val:this.serialize(val,this.constraints)):"";},validate:function(){this.valueNode.value=this.toString();return this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.valueNode=dojo.place("<input type='hidden'"+(this.name?" name='"+this.name+"'":"")+">",this.textbox,"after");},reset:function(){this.valueNode.value="";this.inherited(arguments);}});dojo.declare("dijit.form.RangeBoundTextBox",dijit.form.MappedTextBox,{rangeMessage:"",rangeCheck:function(_378,_379){return ("min" in _379?(this.compare(_378,_379.min)>=0):true)&&("max" in _379?(this.compare(_378,_379.max)<=0):true);},isInRange:function(_37a){return this.rangeCheck(this.attr("value"),this.constraints);},_isDefinitelyOutOfRange:function(){var val=this.attr("value");var _37b=false;var _37c=false;if("min" in this.constraints){var min=this.constraints.min;min=this.compare(val,((typeof min=="number")&&min>=0&&val!=0)?0:min);_37b=(typeof min=="number")&&min<0;}if("max" in this.constraints){var max=this.constraints.max;max=this.compare(val,((typeof max!="number")||max>0)?max:0);_37c=(typeof max=="number")&&max>0;}return _37b||_37c;},_isValidSubset:function(){return this.inherited(arguments)&&!this._isDefinitelyOutOfRange();},isValid:function(_37d){return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_37d));},getErrorMessage:function(_37e){var v=this.attr("value");if(v!==null&&v!==""&&v!==undefined&&!this.isInRange(_37e)){return this.rangeMessage;}return this.inherited(arguments);},postMixInProperties:function(){this.inherited(arguments);if(!this.rangeMessage){this.messages=dojo.i18n.getLocalization("dijit.form","validate",this.lang);this.rangeMessage=this.messages.rangeMessage;}},postCreate:function(){this.inherited(arguments);if(this.constraints.min!==undefined){dijit.setWaiState(this.focusNode,"valuemin",this.constraints.min);}if(this.constraints.max!==undefined){dijit.setWaiState(this.focusNode,"valuemax",this.constraints.max);}},_setValueAttr:function(_37f,_380){dijit.setWaiState(this.focusNode,"valuenow",_37f);this.inherited(arguments);}});}if(!dojo._hasResource["dojo.cldr.monetary"]){dojo._hasResource["dojo.cldr.monetary"]=true;dojo.provide("dojo.cldr.monetary");dojo.cldr.monetary.getData=function(code){var _381={ADP:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,DJF:0,ESP:0,GNF:0,IQD:3,ITL:0,JOD:3,JPY:0,KMF:0,KRW:0,KWD:3,LUF:0,LYD:3,MGA:0,MGF:0,OMR:3,PYG:0,RWF:0,TND:3,TRL:0,VUV:0,XAF:0,XOF:0,XPF:0};var _382={CHF:5};var _383=_381[code],_384=_382[code];if(typeof _383=="undefined"){_383=2;}if(typeof _384=="undefined"){_384=0;}return {places:_383,round:_384};};}if(!dojo._hasResource["dojo.currency"]){dojo._hasResource["dojo.currency"]=true;dojo.provide("dojo.currency");dojo.currency._mixInDefaults=function(_385){_385=_385||{};_385.type="currency";var _386=dojo.i18n.getLocalization("dojo.cldr","currency",_385.locale)||{};var iso=_385.currency;var data=dojo.cldr.monetary.getData(iso);dojo.forEach(["displayName","symbol","group","decimal"],function(prop){data[prop]=_386[iso+"_"+prop];});data.fractional=[true,false];return dojo.mixin(data,_385);};dojo.currency.format=function(_387,_388){return dojo.number.format(_387,dojo.currency._mixInDefaults(_388));};dojo.currency.regexp=function(_389){return dojo.number.regexp(dojo.currency._mixInDefaults(_389));};dojo.currency.parse=function(_38a,_38b){return dojo.number.parse(_38a,dojo.currency._mixInDefaults(_38b));};}if(!dojo._hasResource["dijit.form.NumberTextBox"]){dojo._hasResource["dijit.form.NumberTextBox"]=true;dojo.provide("dijit.form.NumberTextBox");dojo.declare("dijit.form.NumberTextBoxMixin",null,{regExpGen:dojo.number.regexp,value:NaN,editOptions:{pattern:"#.######"},_formatter:dojo.number.format,postMixInProperties:function(){var _38c=typeof this.constraints.places=="number"?this.constraints.places:0;if(_38c){_38c++;}if(typeof this.constraints.max!="number"){this.constraints.max=9*Math.pow(10,15-_38c);}if(typeof this.constraints.min!="number"){this.constraints.min=-9*Math.pow(10,15-_38c);}this.inherited(arguments);},_onFocus:function(){if(this.disabled){return;}var val=this.attr("value");if(typeof val=="number"&&!isNaN(val)){var _38d=this.format(val,this.constraints);if(_38d!==undefined){this.textbox.value=_38d;}}this.inherited(arguments);},format:function(_38e,_38f){if(typeof _38e!="number"){return String(_38e);}if(isNaN(_38e)){return "";}if(("rangeCheck" in this)&&!this.rangeCheck(_38e,_38f)){return String(_38e);}if(this.editOptions&&this._focused){_38f=dojo.mixin({},_38f,this.editOptions);}return this._formatter(_38e,_38f);},parse:dojo.number.parse,_getDisplayedValueAttr:function(){var v=this.inherited(arguments);return isNaN(v)?this.textbox.value:v;},filter:function(_390){return (_390===null||_390===""||_390===undefined)?NaN:this.inherited(arguments);},serialize:function(_391,_392){return (typeof _391!="number"||isNaN(_391))?"":this.inherited(arguments);},_setValueAttr:function(_393,_394,_395){if(_393!==undefined&&_395===undefined){if(typeof _393=="number"){if(isNaN(_393)){_395="";}else{if(("rangeCheck" in this)&&!this.rangeCheck(_393,this.constraints)){_395=String(_393);}}}else{if(!_393){_395="";_393=NaN;}else{_395=String(_393);_393=undefined;}}}this.inherited(arguments,[_393,_394,_395]);},_getValueAttr:function(){var v=this.inherited(arguments);if(isNaN(v)&&this.textbox.value!==""){if(this.constraints.exponent!==false&&/\de[-+]?|\d/i.test(this.textbox.value)&&(new RegExp("^"+dojo.number._realNumberRegexp(dojo.mixin({},this.constraints))+"$").test(this.textbox.value))){var n=Number(this.textbox.value);return isNaN(n)?undefined:n;}else{return undefined;}}else{return v;}},isValid:function(_396){if(!this._focused||this._isEmpty(this.textbox.value)){return this.inherited(arguments);}else{var v=this.attr("value");if(!isNaN(v)&&this.rangeCheck(v,this.constraints)){if(this.constraints.exponent!==false&&/\de[-+]?\d/i.test(this.textbox.value)){return true;}else{return this.inherited(arguments);}}else{return false;}}}});dojo.declare("dijit.form.NumberTextBox",[dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin],{});}if(!dojo._hasResource["dijit.form.CurrencyTextBox"]){dojo._hasResource["dijit.form.CurrencyTextBox"]=true;dojo.provide("dijit.form.CurrencyTextBox");dojo.declare("dijit.form.CurrencyTextBox",dijit.form.NumberTextBox,{currency:"",regExpGen:function(_397){return "("+(this._focused?this.inherited(arguments,[dojo.mixin({},_397,this.editOptions)])+"|":"")+dojo.currency.regexp(_397)+")";},_formatter:dojo.currency.format,parse:function(_398,_399){var v=dojo.currency.parse(_398,_399);if(isNaN(v)&&/\d+/.test(_398)){return this.inherited(arguments,[_398,dojo.mixin({},_399,this.editOptions)]);}return v;},postMixInProperties:function(){this.constraints=dojo.currency._mixInDefaults(dojo.mixin(this.constraints,{currency:this.currency,exponent:false}));this.inherited(arguments);}});}if(!dojo._hasResource["dojo.cldr.supplemental"]){dojo._hasResource["dojo.cldr.supplemental"]=true;dojo.provide("dojo.cldr.supplemental");dojo.cldr.supplemental.getFirstDayOfWeek=function(_39a){var _39b={mv:5,ae:6,af:6,bh:6,dj:6,dz:6,eg:6,er:6,et:6,iq:6,ir:6,jo:6,ke:6,kw:6,lb:6,ly:6,ma:6,om:6,qa:6,sa:6,sd:6,so:6,tn:6,ye:6,as:0,au:0,az:0,bw:0,ca:0,cn:0,fo:0,ge:0,gl:0,gu:0,hk:0,ie:0,il:0,is:0,jm:0,jp:0,kg:0,kr:0,la:0,mh:0,mo:0,mp:0,mt:0,nz:0,ph:0,pk:0,sg:0,th:0,tt:0,tw:0,um:0,us:0,uz:0,vi:0,za:0,zw:0,et:0,mw:0,ng:0,tj:0,sy:4};var _39c=dojo.cldr.supplemental._region(_39a);var dow=_39b[_39c];return (dow===undefined)?1:dow;};dojo.cldr.supplemental._region=function(_39d){_39d=dojo.i18n.normalizeLocale(_39d);var tags=_39d.split("-");var _39e=tags[1];if(!_39e){_39e={de:"de",en:"us",es:"es",fi:"fi",fr:"fr",he:"il",hu:"hu",it:"it",ja:"jp",ko:"kr",nl:"nl",pt:"br",sv:"se",zh:"cn"}[tags[0]];}else{if(_39e.length==4){_39e=tags[2];}}return _39e;};dojo.cldr.supplemental.getWeekend=function(_39f){var _3a0={eg:5,il:5,sy:5,"in":0,ae:4,bh:4,dz:4,iq:4,jo:4,kw:4,lb:4,ly:4,ma:4,om:4,qa:4,sa:4,sd:4,tn:4,ye:4};var _3a1={ae:5,bh:5,dz:5,iq:5,jo:5,kw:5,lb:5,ly:5,ma:5,om:5,qa:5,sa:5,sd:5,tn:5,ye:5,af:5,ir:5,eg:6,il:6,sy:6};var _3a2=dojo.cldr.supplemental._region(_39f);var _3a3=_3a0[_3a2];var end=_3a1[_3a2];if(_3a3===undefined){_3a3=6;}if(end===undefined){end=0;}return {start:_3a3,end:end};};}if(!dojo._hasResource["dojo.date"]){dojo._hasResource["dojo.date"]=true;dojo.provide("dojo.date");dojo.date.getDaysInMonth=function(_3a4){var _3a5=_3a4.getMonth();var days=[31,28,31,30,31,30,31,31,30,31,30,31];if(_3a5==1&&dojo.date.isLeapYear(_3a4)){return 29;}return days[_3a5];};dojo.date.isLeapYear=function(_3a6){var year=_3a6.getFullYear();return !(year%400)||(!(year%4)&&!!(year%100));};dojo.date.getTimezoneName=function(_3a7){var str=_3a7.toString();var tz="";var _3a8;var pos=str.indexOf("(");if(pos>-1){tz=str.substring(++pos,str.indexOf(")"));}else{var pat=/([A-Z\/]+) \d{4}$/;if((_3a8=str.match(pat))){tz=_3a8[1];}else{str=_3a7.toLocaleString();pat=/ ([A-Z\/]+)$/;if((_3a8=str.match(pat))){tz=_3a8[1];}}}return (tz=="AM"||tz=="PM")?"":tz;};dojo.date.compare=function(_3a9,_3aa,_3ab){_3a9=new Date(+_3a9);_3aa=new Date(+(_3aa||new Date()));if(_3ab=="date"){_3a9.setHours(0,0,0,0);_3aa.setHours(0,0,0,0);}else{if(_3ab=="time"){_3a9.setFullYear(0,0,0);_3aa.setFullYear(0,0,0);}}if(_3a9>_3aa){return 1;}if(_3a9<_3aa){return -1;}return 0;};dojo.date.add=function(date,_3ac,_3ad){var sum=new Date(+date);var _3ae=false;var _3af="Date";switch(_3ac){case "day":break;case "weekday":var days,_3b0;var mod=_3ad%5;if(!mod){days=(_3ad>0)?5:-5;_3b0=(_3ad>0)?((_3ad-5)/5):((_3ad+5)/5);}else{days=mod;_3b0=parseInt(_3ad/5);}var strt=date.getDay();var adj=0;if(strt==6&&_3ad>0){adj=1;}else{if(strt==0&&_3ad<0){adj=-1;}}var trgt=strt+days;if(trgt==0||trgt==6){adj=(_3ad>0)?2:-2;}_3ad=(7*_3b0)+days+adj;break;case "year":_3af="FullYear";_3ae=true;break;case "week":_3ad*=7;break;case "quarter":_3ad*=3;case "month":_3ae=true;_3af="Month";break;default:_3af="UTC"+_3ac.charAt(0).toUpperCase()+_3ac.substring(1)+"s";}if(_3af){sum["set"+_3af](sum["get"+_3af]()+_3ad);}if(_3ae&&(sum.getDate()<date.getDate())){sum.setDate(0);}return sum;};dojo.date.difference=function(_3b1,_3b2,_3b3){_3b2=_3b2||new Date();_3b3=_3b3||"day";var _3b4=_3b2.getFullYear()-_3b1.getFullYear();var _3b5=1;switch(_3b3){case "quarter":var m1=_3b1.getMonth();var m2=_3b2.getMonth();var q1=Math.floor(m1/3)+1;var q2=Math.floor(m2/3)+1;q2+=(_3b4*4);_3b5=q2-q1;break;case "weekday":var days=Math.round(dojo.date.difference(_3b1,_3b2,"day"));var _3b6=parseInt(dojo.date.difference(_3b1,_3b2,"week"));var mod=days%7;if(mod==0){days=_3b6*5;}else{var adj=0;var aDay=_3b1.getDay();var bDay=_3b2.getDay();_3b6=parseInt(days/7);mod=days%7;var _3b7=new Date(_3b1);_3b7.setDate(_3b7.getDate()+(_3b6*7));var _3b8=_3b7.getDay();if(days>0){switch(true){case aDay==6:adj=-1;break;case aDay==0:adj=0;break;case bDay==6:adj=-1;break;case bDay==0:adj=-2;break;case (_3b8+mod)>5:adj=-2;}}else{if(days<0){switch(true){case aDay==6:adj=0;break;case aDay==0:adj=1;break;case bDay==6:adj=2;break;case bDay==0:adj=1;break;case (_3b8+mod)<0:adj=2;}}}days+=adj;days-=(_3b6*2);}_3b5=days;break;case "year":_3b5=_3b4;break;case "month":_3b5=(_3b2.getMonth()-_3b1.getMonth())+(_3b4*12);break;case "week":_3b5=parseInt(dojo.date.difference(_3b1,_3b2,"day")/7);break;case "day":_3b5/=24;case "hour":_3b5/=60;case "minute":_3b5/=60;case "second":_3b5/=1000;case "millisecond":_3b5*=_3b2.getTime()-_3b1.getTime();}return Math.round(_3b5);};}if(!dojo._hasResource["dojo.date.locale"]){dojo._hasResource["dojo.date.locale"]=true;dojo.provide("dojo.date.locale");(function(){function _3b9(_3ba,_3bb,_3bc,_3bd){return _3bd.replace(/([a-z])\1*/ig,function(_3be){var s,pad,c=_3be.charAt(0),l=_3be.length,_3bf=["abbr","wide","narrow"];switch(c){case "G":s=_3bb[(l<4)?"eraAbbr":"eraNames"][_3ba.getFullYear()<0?0:1];break;case "y":s=_3ba.getFullYear();switch(l){case 1:break;case 2:if(!_3bc.fullYear){s=String(s);s=s.substr(s.length-2);break;}default:pad=true;}break;case "Q":case "q":s=Math.ceil((_3ba.getMonth()+1)/3);pad=true;break;case "M":var m=_3ba.getMonth();if(l<3){s=m+1;pad=true;}else{var _3c0=["months","format",_3bf[l-3]].join("-");s=_3bb[_3c0][m];}break;case "w":var _3c1=0;s=dojo.date.locale._getWeekOfYear(_3ba,_3c1);pad=true;break;case "d":s=_3ba.getDate();pad=true;break;case "D":s=dojo.date.locale._getDayOfYear(_3ba);pad=true;break;case "E":var d=_3ba.getDay();if(l<3){s=d+1;pad=true;}else{var _3c2=["days","format",_3bf[l-3]].join("-");s=_3bb[_3c2][d];}break;case "a":var _3c3=(_3ba.getHours()<12)?"am":"pm";s=_3bb[_3c3];break;case "h":case "H":case "K":case "k":var h=_3ba.getHours();switch(c){case "h":s=(h%12)||12;break;case "H":s=h;break;case "K":s=(h%12);break;case "k":s=h||24;break;}pad=true;break;case "m":s=_3ba.getMinutes();pad=true;break;case "s":s=_3ba.getSeconds();pad=true;break;case "S":s=Math.round(_3ba.getMilliseconds()*Math.pow(10,l-3));pad=true;break;case "v":case "z":s=dojo.date.locale._getZone(_3ba,true,_3bc);if(s){break;}l=4;case "Z":var _3c4=dojo.date.locale._getZone(_3ba,false,_3bc);var tz=[(_3c4<=0?"+":"-"),dojo.string.pad(Math.floor(Math.abs(_3c4)/60),2),dojo.string.pad(Math.abs(_3c4)%60,2)];if(l==4){tz.splice(0,0,"GMT");tz.splice(3,0,":");}s=tz.join("");break;default:throw new Error("dojo.date.locale.format: invalid pattern char: "+_3bd);}if(pad){s=dojo.string.pad(s,l);}return s;});};dojo.date.locale._getZone=function(_3c5,_3c6,_3c7){if(_3c6){return dojo.date.getTimezoneName(_3c5);}else{return _3c5.getTimezoneOffset();}};dojo.date.locale.format=function(_3c8,_3c9){_3c9=_3c9||{};var _3ca=dojo.i18n.normalizeLocale(_3c9.locale),_3cb=_3c9.formatLength||"short",_3cc=dojo.date.locale._getGregorianBundle(_3ca),str=[],_3cd=dojo.hitch(this,_3b9,_3c8,_3cc,_3c9);if(_3c9.selector=="year"){return _3ce(_3cc["dateFormatItem-yyyy"]||"yyyy",_3cd);}var _3cf;if(_3c9.selector!="date"){_3cf=_3c9.timePattern||_3cc["timeFormat-"+_3cb];if(_3cf){str.push(_3ce(_3cf,_3cd));}}if(_3c9.selector!="time"){_3cf=_3c9.datePattern||_3cc["dateFormat-"+_3cb];if(_3cf){str.push(_3ce(_3cf,_3cd));}}return str.length==1?str[0]:_3cc["dateTimeFormat-"+_3cb].replace(/\{(\d+)\}/g,function(_3d0,key){return str[key];});};dojo.date.locale.regexp=function(_3d1){return dojo.date.locale._parseInfo(_3d1).regexp;};dojo.date.locale._parseInfo=function(_3d2){_3d2=_3d2||{};var _3d3=dojo.i18n.normalizeLocale(_3d2.locale),_3d4=dojo.date.locale._getGregorianBundle(_3d3),_3d5=_3d2.formatLength||"short",_3d6=_3d2.datePattern||_3d4["dateFormat-"+_3d5],_3d7=_3d2.timePattern||_3d4["timeFormat-"+_3d5],_3d8;if(_3d2.selector=="date"){_3d8=_3d6;}else{if(_3d2.selector=="time"){_3d8=_3d7;}else{_3d8=_3d4["dateTimeFormat-"+_3d5].replace(/\{(\d+)\}/g,function(_3d9,key){return [_3d7,_3d6][key];});}}var _3da=[],re=_3ce(_3d8,dojo.hitch(this,_3db,_3da,_3d4,_3d2));return {regexp:re,tokens:_3da,bundle:_3d4};};dojo.date.locale.parse=function(_3dc,_3dd){var info=dojo.date.locale._parseInfo(_3dd),_3de=info.tokens,_3df=info.bundle,re=new RegExp("^"+info.regexp+"$",info.strict?"":"i"),_3e0=re.exec(_3dc);if(!_3e0){return null;}var _3e1=["abbr","wide","narrow"],_3e2=[1970,0,1,0,0,0,0],amPm="",_3e3=dojo.every(_3e0,function(v,i){if(!i){return true;}var _3e4=_3de[i-1];var l=_3e4.length;switch(_3e4.charAt(0)){case "y":if(l!=2&&_3dd.strict){_3e2[0]=v;}else{if(v<100){v=Number(v);var year=""+new Date().getFullYear(),_3e5=year.substring(0,2)*100,_3e6=Math.min(Number(year.substring(2,4))+20,99),num=(v<_3e6)?_3e5+v:_3e5-100+v;_3e2[0]=num;}else{if(_3dd.strict){return false;}_3e2[0]=v;}}break;case "M":if(l>2){var _3e7=_3df["months-format-"+_3e1[l-3]].concat();if(!_3dd.strict){v=v.replace(".","").toLowerCase();_3e7=dojo.map(_3e7,function(s){return s.replace(".","").toLowerCase();});}v=dojo.indexOf(_3e7,v);if(v==-1){return false;}}else{v--;}_3e2[1]=v;break;case "E":case "e":var days=_3df["days-format-"+_3e1[l-3]].concat();if(!_3dd.strict){v=v.toLowerCase();days=dojo.map(days,function(d){return d.toLowerCase();});}v=dojo.indexOf(days,v);if(v==-1){return false;}break;case "D":_3e2[1]=0;case "d":_3e2[2]=v;break;case "a":var am=_3dd.am||_3df.am;var pm=_3dd.pm||_3df.pm;if(!_3dd.strict){var _3e8=/\./g;v=v.replace(_3e8,"").toLowerCase();am=am.replace(_3e8,"").toLowerCase();pm=pm.replace(_3e8,"").toLowerCase();}if(_3dd.strict&&v!=am&&v!=pm){return false;}amPm=(v==pm)?"p":(v==am)?"a":"";break;case "K":if(v==24){v=0;}case "h":case "H":case "k":if(v>23){return false;}_3e2[3]=v;break;case "m":_3e2[4]=v;break;case "s":_3e2[5]=v;break;case "S":_3e2[6]=v;}return true;});var _3e9=+_3e2[3];if(amPm==="p"&&_3e9<12){_3e2[3]=_3e9+12;}else{if(amPm==="a"&&_3e9==12){_3e2[3]=0;}}var _3ea=new Date(_3e2[0],_3e2[1],_3e2[2],_3e2[3],_3e2[4],_3e2[5],_3e2[6]);if(_3dd.strict){_3ea.setFullYear(_3e2[0]);}var _3eb=_3de.join(""),_3ec=_3eb.indexOf("d")!=-1,_3ed=_3eb.indexOf("M")!=-1;if(!_3e3||(_3ed&&_3ea.getMonth()>_3e2[1])||(_3ec&&_3ea.getDate()>_3e2[2])){return null;}if((_3ed&&_3ea.getMonth()<_3e2[1])||(_3ec&&_3ea.getDate()<_3e2[2])){_3ea=dojo.date.add(_3ea,"hour",1);}return _3ea;};function _3ce(_3ee,_3ef,_3f0,_3f1){var _3f2=function(x){return x;};_3ef=_3ef||_3f2;_3f0=_3f0||_3f2;_3f1=_3f1||_3f2;var _3f3=_3ee.match(/(''|[^'])+/g),_3f4=_3ee.charAt(0)=="'";dojo.forEach(_3f3,function(_3f5,i){if(!_3f5){_3f3[i]="";}else{_3f3[i]=(_3f4?_3f0:_3ef)(_3f5);_3f4=!_3f4;}});return _3f1(_3f3.join(""));};function _3db(_3f6,_3f7,_3f8,_3f9){_3f9=dojo.regexp.escapeString(_3f9);if(!_3f8.strict){_3f9=_3f9.replace(" a"," ?a");}return _3f9.replace(/([a-z])\1*/ig,function(_3fa){var s,c=_3fa.charAt(0),l=_3fa.length,p2="",p3="";if(_3f8.strict){if(l>1){p2="0"+"{"+(l-1)+"}";}if(l>2){p3="0"+"{"+(l-2)+"}";}}else{p2="0?";p3="0{0,2}";}switch(c){case "y":s="\\d{2,4}";break;case "M":s=(l>2)?"\\S+?":p2+"[1-9]|1[0-2]";break;case "D":s=p2+"[1-9]|"+p3+"[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6]";break;case "d":s="[12]\\d|"+p2+"[1-9]|3[01]";break;case "w":s=p2+"[1-9]|[1-4][0-9]|5[0-3]";break;case "E":s="\\S+";break;case "h":s=p2+"[1-9]|1[0-2]";break;case "k":s=p2+"\\d|1[01]";break;case "H":s=p2+"\\d|1\\d|2[0-3]";break;case "K":s=p2+"[1-9]|1\\d|2[0-4]";break;case "m":case "s":s="[0-5]\\d";break;case "S":s="\\d{"+l+"}";break;case "a":var am=_3f8.am||_3f7.am||"AM";var pm=_3f8.pm||_3f7.pm||"PM";if(_3f8.strict){s=am+"|"+pm;}else{s=am+"|"+pm;if(am!=am.toLowerCase()){s+="|"+am.toLowerCase();}if(pm!=pm.toLowerCase()){s+="|"+pm.toLowerCase();}if(s.indexOf(".")!=-1){s+="|"+s.replace(/\./g,"");}}s=s.replace(/\./g,"\\.");break;default:s=".*";}if(_3f6){_3f6.push(_3fa);}return "("+s+")";}).replace(/[\xa0 ]/g,"[\\s\\xa0]");};})();(function(){var _3fb=[];dojo.date.locale.addCustomFormats=function(_3fc,_3fd){_3fb.push({pkg:_3fc,name:_3fd});};dojo.date.locale._getGregorianBundle=function(_3fe){var _3ff={};dojo.forEach(_3fb,function(desc){var _400=dojo.i18n.getLocalization(desc.pkg,desc.name,_3fe);_3ff=dojo.mixin(_3ff,_400);},this);return _3ff;};})();dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");dojo.date.locale.getNames=function(item,type,_401,_402){var _403,_404=dojo.date.locale._getGregorianBundle(_402),_405=[item,_401,type];if(_401=="standAlone"){var key=_405.join("-");_403=_404[key];if(_403[0]==1){_403=undefined;}}_405[1]="format";return (_403||_404[_405.join("-")]).concat();};dojo.date.locale.isWeekend=function(_406,_407){var _408=dojo.cldr.supplemental.getWeekend(_407),day=(_406||new Date()).getDay();if(_408.end<_408.start){_408.end+=7;if(day<_408.start){day+=7;}}return day>=_408.start&&day<=_408.end;};dojo.date.locale._getDayOfYear=function(_409){return dojo.date.difference(new Date(_409.getFullYear(),0,1,_409.getHours()),_409)+1;};dojo.date.locale._getWeekOfYear=function(_40a,_40b){if(arguments.length==1){_40b=0;}var _40c=new Date(_40a.getFullYear(),0,1).getDay(),adj=(_40c-_40b+7)%7,week=Math.floor((dojo.date.locale._getDayOfYear(_40a)+adj-1)/7);if(_40c==_40b){week++;}return week;};}if(!dojo._hasResource["dijit.Calendar"]){dojo._hasResource["dijit.Calendar"]=true;dojo.provide("dijit.Calendar");dojo.declare("dijit.Calendar",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dijit","templates/Calendar.html","<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\" role=\"grid\" dojoAttachEvent=\"onkeypress: _onKeyPress\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"decrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarDecrease\" waiRole=\"presentation\">\n\t\t\t\t<span dojoAttachPoint=\"decreaseArrowNode\" class=\"dijitA11ySideArrow\">-</span>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div class=\"dijitVisible\">\n\t\t\t\t\t<div class=\"dijitPopup dijitMenu dijitMenuPassive dijitHidden\" dojoAttachPoint=\"monthDropDown\" dojoAttachEvent=\"onmouseup: _onMonthSelect, onmouseover: _onMenuHover, onmouseout: _onMenuHover\">\n\t\t\t\t\t\t<div class=\"dijitCalendarMonthLabelTemplate dijitCalendarMonthLabel\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelSpacer\" class=\"dijitSpacer\"></div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelNode\" class=\"dijitCalendarMonthLabel dijitInline dijitVisible\" dojoAttachEvent=\"onmousedown: _onMonthToggle\"></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"incrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarIncrease\" waiRole=\"presentation\">\n\t\t\t\t<span dojoAttachPoint=\"increaseArrowNode\" class=\"dijitA11ySideArrow\">+</span>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th class=\"dijitReset dijitCalendarDayLabelTemplate\" role=\"columnheader\"><span class=\"dijitCalendarDayLabel\"></span></th>\n\t\t</tr>\n\t</thead>\n\t<tbody dojoAttachEvent=\"onclick: _onDayClick, onmouseover: _onDayMouseOver, onmouseout: _onDayMouseOut\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t<tr class=\"dijitReset dijitCalendarWeekTemplate\" role=\"row\">\n\t\t\t<td class=\"dijitReset dijitCalendarDateTemplate\" role=\"gridcell\"><span class=\"dijitCalendarDateLabel\"></span></td>\n\t\t</tr>\n\t</tbody>\n\t<tfoot class=\"dijitReset dijitCalendarYearContainer\">\n\t\t<tr>\n\t\t\t<td class='dijitReset' valign=\"top\" colspan=\"7\">\n\t\t\t\t<h3 class=\"dijitCalendarYearLabel\">\n\t\t\t\t\t<span dojoAttachPoint=\"previousYearLabelNode\" class=\"dijitInline dijitCalendarPreviousYear\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"currentYearLabelNode\" class=\"dijitInline dijitCalendarSelectedYear\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"nextYearLabelNode\" class=\"dijitInline dijitCalendarNextYear\"></span>\n\t\t\t\t</h3>\n\t\t\t</td>\n\t\t</tr>\n\t</tfoot>\n</table>\n"),value:new Date(),datePackage:"dojo.date",dayWidth:"narrow",tabIndex:"0",attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{tabIndex:"domNode"}),setValue:function(_40d){dojo.deprecated("dijit.Calendar:setValue() is deprecated.  Use attr('value', ...) instead.","","2.0");this.attr("value",_40d);},_getValueAttr:function(){var _40e=new this.dateClassObj(this.value);_40e.setHours(0,0,0,0);if(_40e.getDate()<this.value.getDate()){_40e=this.dateFuncObj.add(_40e,"hour",1);}return _40e;},_setValueAttr:function(_40f){if(!this.value||this.dateFuncObj.compare(_40f,this.value)){_40f=new this.dateClassObj(_40f);_40f.setHours(1);this.displayMonth=new this.dateClassObj(_40f);if(!this.isDisabledDate(_40f,this.lang)){this.value=_40f;this.onChange(this.attr("value"));}dojo.attr(this.domNode,"aria-label",this.dateLocaleModule.format(_40f,{selector:"date",formatLength:"full"}));this._populateGrid();}},_setText:function(node,text){while(node.firstChild){node.removeChild(node.firstChild);}node.appendChild(dojo.doc.createTextNode(text));},_populateGrid:function(){var _410=this.displayMonth;_410.setDate(1);var _411=_410.getDay(),_412=this.dateFuncObj.getDaysInMonth(_410),_413=this.dateFuncObj.getDaysInMonth(this.dateFuncObj.add(_410,"month",-1)),_414=new this.dateClassObj(),_415=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);if(_415>_411){_415-=7;}dojo.query(".dijitCalendarDateTemplate",this.domNode).forEach(function(_416,i){i+=_415;var date=new this.dateClassObj(_410),_417,_418="dijitCalendar",adj=0;if(i<_411){_417=_413-_411+i+1;adj=-1;_418+="Previous";}else{if(i>=(_411+_412)){_417=i-_411-_412+1;adj=1;_418+="Next";}else{_417=i-_411+1;_418+="Current";}}if(adj){date=this.dateFuncObj.add(date,"month",adj);}date.setDate(_417);if(!this.dateFuncObj.compare(date,_414,"date")){_418="dijitCalendarCurrentDate "+_418;}if(this._isSelectedDate(date,this.lang)){_418="dijitCalendarSelectedDate "+_418;}if(this.isDisabledDate(date,this.lang)){_418="dijitCalendarDisabledDate "+_418;}var _419=this.getClassForDate(date,this.lang);if(_419){_418=_419+" "+_418;}_416.className=_418+"Month dijitCalendarDateTemplate";_416.dijitDateValue=date.valueOf();var _41a=dojo.query(".dijitCalendarDateLabel",_416)[0],text=date.getDateLocalized?date.getDateLocalized(this.lang):date.getDate();this._setText(_41a,text);},this);var _41b=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang);this._setText(this.monthLabelNode,_41b[_410.getMonth()]);var y=_410.getFullYear()-1;var d=new this.dateClassObj();dojo.forEach(["previous","current","next"],function(name){d.setFullYear(y++);this._setText(this[name+"YearLabelNode"],this.dateLocaleModule.format(d,{selector:"year",locale:this.lang}));},this);var _41c=this;var _41d=function(_41e,_41f,adj){_41c._connects.push(dijit.typematic.addMouseListener(_41c[_41e],_41c,function(_420){if(_420>=0){_41c._adjustDisplay(_41f,adj);}},0.8,500));};_41d("incrementMonth","month",1);_41d("decrementMonth","month",-1);_41d("nextYearLabelNode","year",1);_41d("previousYearLabelNode","year",-1);},goToToday:function(){this.attr("value",new this.dateClassObj());},constructor:function(args){var _421=(args.datePackage&&(args.datePackage!="dojo.date"))?args.datePackage+".Date":"Date";this.dateClassObj=dojo.getObject(_421,false);this.datePackage=args.datePackage||this.datePackage;this.dateFuncObj=dojo.getObject(this.datePackage,false);this.dateLocaleModule=dojo.getObject(this.datePackage+".locale",false);},postMixInProperties:function(){if(isNaN(this.value)){delete this.value;}this.inherited(arguments);},postCreate:function(){this.inherited(arguments);dojo.setSelectable(this.domNode,false);var _422=dojo.hitch(this,function(_423,n){var _424=dojo.query(_423,this.domNode)[0];for(var i=0;i<n;i++){_424.parentNode.appendChild(_424.cloneNode(true));}});_422(".dijitCalendarDayLabelTemplate",6);_422(".dijitCalendarDateTemplate",6);_422(".dijitCalendarWeekTemplate",5);var _425=this.dateLocaleModule.getNames("days",this.dayWidth,"standAlone",this.lang);var _426=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);dojo.query(".dijitCalendarDayLabel",this.domNode).forEach(function(_427,i){this._setText(_427,_425[(i+_426)%7]);},this);var _428=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang);_422(".dijitCalendarMonthLabelTemplate",_428.length-1);dojo.query(".dijitCalendarMonthLabelTemplate",this.domNode).forEach(function(node,i){dojo.attr(node,"month",i);this._setText(node,_428[i]);dojo.place(node.cloneNode(true),this.monthLabelSpacer);},this);var _429=this.value;this.value=null;this.attr("value",new this.dateClassObj(_429));},_onMenuHover:function(e){dojo.stopEvent(e);dojo.toggleClass(e.target,"dijitMenuItemHover");},_adjustDisplay:function(part,_42a){this.displayMonth=this.dateFuncObj.add(this.displayMonth,part,_42a);this._populateGrid();},_onMonthToggle:function(evt){dojo.stopEvent(evt);if(evt.type=="mousedown"){var _42b=dojo.position(this.monthLabelNode);var dim={width:_42b.w+"px",top:-this.displayMonth.getMonth()*_42b.h+"px"};if((dojo.isIE&&dojo.isQuirks)||dojo.isIE<7){dim.left=-_42b.w/2+"px";}dojo.style(this.monthDropDown,dim);this._popupHandler=this.connect(document,"onmouseup","_onMonthToggle");}else{this.disconnect(this._popupHandler);delete this._popupHandler;}dojo.toggleClass(this.monthDropDown,"dijitHidden");dojo.toggleClass(this.monthLabelNode,"dijitVisible");},_onMonthSelect:function(evt){this._onMonthToggle(evt);this.displayMonth.setMonth(dojo.attr(evt.target,"month"));this._populateGrid();},_onDayClick:function(evt){dojo.stopEvent(evt);for(var node=evt.target;node&&!node.dijitDateValue;node=node.parentNode){}if(node&&!dojo.hasClass(node,"dijitCalendarDisabledDate")){this.attr("value",node.dijitDateValue);this.onValueSelected(this.attr("value"));}},_onDayMouseOver:function(evt){var node=evt.target;if(node&&(node.dijitDateValue||node==this.previousYearLabelNode||node==this.nextYearLabelNode)){dojo.addClass(node,"dijitCalendarHoveredDate");this._currentNode=node;}},_onDayMouseOut:function(evt){if(!this._currentNode){return;}for(var node=evt.relatedTarget;node;){if(node==this._currentNode){return;}try{node=node.parentNode;}catch(x){node=null;}}dojo.removeClass(this._currentNode,"dijitCalendarHoveredDate");this._currentNode=null;},_onKeyPress:function(evt){var dk=dojo.keys,_42c=-1,_42d,_42e=this.value;switch(evt.keyCode){case dk.RIGHT_ARROW:_42c=1;case dk.LEFT_ARROW:_42d="day";if(!this.isLeftToRight()){_42c*=-1;}break;case dk.DOWN_ARROW:_42c=1;case dk.UP_ARROW:_42d="week";break;case dk.PAGE_DOWN:_42c=1;case dk.PAGE_UP:_42d=evt.ctrlKey?"year":"month";break;case dk.END:_42e=this.dateFuncObj.add(_42e,"month",1);_42d="day";case dk.HOME:_42e=new Date(_42e).setDate(1);break;case dk.ENTER:this.onValueSelected(this.attr("value"));break;case dk.ESCAPE:default:return;}dojo.stopEvent(evt);if(_42d){_42e=this.dateFuncObj.add(_42e,_42d,_42c);}this.attr("value",_42e);},onValueSelected:function(date){},onChange:function(date){},_isSelectedDate:function(_42f,_430){return !this.dateFuncObj.compare(_42f,this.value,"date");},isDisabledDate:function(_431,_432){},getClassForDate:function(_433,_434){}});}if(!dojo._hasResource["dijit.form._DateTimeTextBox"]){dojo._hasResource["dijit.form._DateTimeTextBox"]=true;dojo.provide("dijit.form._DateTimeTextBox");dojo.declare("dijit.form._DateTimeTextBox",dijit.form.RangeBoundTextBox,{regExpGen:dojo.date.locale.regexp,datePackage:"dojo.date",compare:dojo.date.compare,format:function(_435,_436){if(!_435){return "";}return this.dateLocaleModule.format(_435,_436);},parse:function(_437,_438){return this.dateLocaleModule.parse(_437,_438)||(this._isEmpty(_437)?null:undefined);},serialize:function(val,_439){if(val.toGregorian){val=val.toGregorian();}return dojo.date.stamp.toISOString(val,_439);},value:new Date(""),_blankValue:null,popupClass:"",_selector:"",constructor:function(args){var _43a=args.datePackage?args.datePackage+".Date":"Date";this.dateClassObj=dojo.getObject(_43a,false);this.value=new this.dateClassObj("");this.datePackage=args.datePackage||this.datePackage;this.dateLocaleModule=dojo.getObject(this.datePackage+".locale",false);this.regExpGen=this.dateLocaleModule.regexp;},postMixInProperties:function(){this.inherited(arguments);if(!this.value||this.value.toString()==dijit.form._DateTimeTextBox.prototype.value.toString()){this.value=null;}var _43b=this.constraints;_43b.selector=this._selector;_43b.fullYear=true;var _43c=dojo.date.stamp.fromISOString;if(typeof _43b.min=="string"){_43b.min=_43c(_43b.min);}if(typeof _43b.max=="string"){_43b.max=_43c(_43b.max);}},_onFocus:function(evt){this._open();this.inherited(arguments);},_setValueAttr:function(_43d,_43e,_43f){if(_43d instanceof Date&&!(this.dateClassObj instanceof Date)){_43d=new this.dateClassObj(_43d);}this.inherited(arguments);if(this._picker){if(!_43d){_43d=new this.dateClassObj();}this._picker.attr("value",_43d);}},_open:function(){if(this.disabled||this.readOnly||!this.popupClass){return;}var _440=this;if(!this._picker){var _441=dojo.getObject(this.popupClass,false);this._picker=new _441({onValueSelected:function(_442){if(_440._tabbingAway){delete _440._tabbingAway;}else{_440.focus();}setTimeout(dojo.hitch(_440,"_close"),1);dijit.form._DateTimeTextBox.superclass._setValueAttr.call(_440,_442,true);},id:this.id+"_popup",lang:_440.lang,constraints:_440.constraints,datePackage:_440.datePackage,isDisabledDate:function(date){var _443=dojo.date.compare;var _444=_440.constraints;return _444&&(_444.min&&(_443(_444.min,date,_440._selector)>0)||(_444.max&&_443(_444.max,date,_440._selector)<0));}});this._picker.attr("value",this.attr("value")||new this.dateClassObj());}if(!this._opened){dijit.popup.open({parent:this,popup:this._picker,orient:{"BL":"TL","TL":"BL"},around:this.domNode,onCancel:dojo.hitch(this,this._close),onClose:function(){_440._opened=false;}});this._opened=true;}dojo.marginBox(this._picker.domNode,{w:this.domNode.offsetWidth});},_close:function(){if(this._opened){dijit.popup.close(this._picker);this._opened=false;}},_onBlur:function(){this._close();if(this._picker){this._picker.destroy();delete this._picker;}this.inherited(arguments);},_getDisplayedValueAttr:function(){return this.textbox.value;},_setDisplayedValueAttr:function(_445,_446){this._setValueAttr(this.parse(_445,this.constraints),_446,_445);},destroy:function(){if(this._picker){this._picker.destroy();delete this._picker;}this.inherited(arguments);},postCreate:function(){this.inherited(arguments);this.connect(this.focusNode,"onkeypress",this._onKeyPress);this.connect(this.focusNode,"onclick",this._open);},_onKeyPress:function(e){var p=this._picker,dk=dojo.keys;if(p&&this._opened&&p.handleKey){if(p.handleKey(e)===false){return;}}if(this._opened&&e.charOrCode==dk.ESCAPE&&!(e.shiftKey||e.ctrlKey||e.altKey||e.metaKey)){this._close();dojo.stopEvent(e);}else{if(!this._opened&&e.charOrCode==dk.DOWN_ARROW){this._open();dojo.stopEvent(e);}else{if(e.charOrCode===dk.TAB){this._tabbingAway=true;}else{if(this._opened&&(e.keyChar||e.charOrCode===dk.BACKSPACE||e.charOrCode==dk.DELETE)){setTimeout(dojo.hitch(this,function(){dijit.placeOnScreenAroundElement(p.domNode.parentNode,this.domNode,{"BL":"TL","TL":"BL"},p.orient?dojo.hitch(p,"orient"):null);}),1);}}}}}});}if(!dojo._hasResource["dijit.form.DateTextBox"]){dojo._hasResource["dijit.form.DateTextBox"]=true;dojo.provide("dijit.form.DateTextBox");dojo.declare("dijit.form.DateTextBox",dijit.form._DateTimeTextBox,{baseClass:"dijitTextBox dijitDateTextBox",popupClass:"dijit.Calendar",_selector:"date",value:new Date("")});}if(!dojo._hasResource["dijit.form._Spinner"]){dojo._hasResource["dijit.form._Spinner"]=true;dojo.provide("dijit.form._Spinner");dojo.declare("dijit.form._Spinner",dijit.form.RangeBoundTextBox,{defaultTimeout:500,timeoutChangeRate:0.9,smallDelta:1,largeDelta:10,templateString:dojo.cache("dijit.form","templates/Spinner.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div class=\"dijitInputLayoutContainer\"\n\t\t><div class=\"dijitReset dijitSpinnerButtonContainer\"\n\t\t\t>&nbsp;<div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\t\tdojoAttachPoint=\"upArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"UpArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9650;</div\n\t\t\t></div\n\t\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"downArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"DownArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t\t></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class='dijitReset' dojoAttachPoint=\"textbox,focusNode\" type=\"${type}\" dojoAttachEvent=\"onkeypress:_onKeyPress\"\n\t\t\t\twaiRole=\"spinbutton\" autocomplete=\"off\" ${nameAttrSetting}\n\t\t/></div\n\t></div\n></div>\n"),baseClass:"dijitSpinner",adjust:function(val,_447){return val;},_arrowState:function(node,_448){this._active=_448;this.stateModifier=node.getAttribute("stateModifier")||"";this._setStateClass();},_arrowPressed:function(_449,_44a,_44b){if(this.disabled||this.readOnly){return;}this._arrowState(_449,true);this._setValueAttr(this.adjust(this.attr("value"),_44a*_44b),false);dijit.selectInputText(this.textbox,this.textbox.value.length);},_arrowReleased:function(node){this._wheelTimer=null;if(this.disabled||this.readOnly){return;}this._arrowState(node,false);},_typematicCallback:function(_44c,node,evt){var inc=this.smallDelta;if(node==this.textbox){var k=dojo.keys;var key=evt.charOrCode;inc=(key==k.PAGE_UP||key==k.PAGE_DOWN)?this.largeDelta:this.smallDelta;node=(key==k.UP_ARROW||key==k.PAGE_UP)?this.upArrowNode:this.downArrowNode;}if(_44c==-1){this._arrowReleased(node);}else{this._arrowPressed(node,(node==this.upArrowNode)?1:-1,inc);}},_wheelTimer:null,_mouseWheeled:function(evt){dojo.stopEvent(evt);var _44d=evt.detail?(evt.detail*-1):(evt.wheelDelta/120);if(_44d!==0){var node=this[(_44d>0?"upArrowNode":"downArrowNode")];this._arrowPressed(node,_44d,this.smallDelta);if(!this._wheelTimer){clearTimeout(this._wheelTimer);}this._wheelTimer=setTimeout(dojo.hitch(this,"_arrowReleased",node),50);}},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,!dojo.isMozilla?"onmousewheel":"DOMMouseScroll","_mouseWheeled");this._connects.push(dijit.typematic.addListener(this.upArrowNode,this.textbox,{charOrCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));this._connects.push(dijit.typematic.addListener(this.downArrowNode,this.textbox,{charOrCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));this._connects.push(dijit.typematic.addListener(this.upArrowNode,this.textbox,{charOrCode:dojo.keys.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));this._connects.push(dijit.typematic.addListener(this.downArrowNode,this.textbox,{charOrCode:dojo.keys.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));if(dojo.isIE){var _44e=this;(function resize(){var sz=_44e.upArrowNode.parentNode.offsetHeight;if(sz){_44e.upArrowNode.style.height=sz>>1;_44e.downArrowNode.style.height=sz-(sz>>1);_44e.focusNode.parentNode.style.height=sz;}})();this.connect(this.domNode,"onresize",function(){setTimeout(function(){resize();_44e._setStateClass();},0);});this._layoutHackIE7();}}});}if(!dojo._hasResource["dijit.form.NumberSpinner"]){dojo._hasResource["dijit.form.NumberSpinner"]=true;dojo.provide("dijit.form.NumberSpinner");dojo.declare("dijit.form.NumberSpinner",[dijit.form._Spinner,dijit.form.NumberTextBoxMixin],{adjust:function(val,_44f){var tc=this.constraints,v=isNaN(val),_450=!isNaN(tc.max),_451=!isNaN(tc.min);if(v&&_44f!=0){val=(_44f>0)?_451?tc.min:_450?tc.max:0:_450?this.constraints.max:_451?tc.min:0;}var _452=val+_44f;if(v||isNaN(_452)){return val;}if(_450&&(_452>tc.max)){_452=tc.max;}if(_451&&(_452<tc.min)){_452=tc.min;}return _452;},_onKeyPress:function(e){if((e.charOrCode==dojo.keys.HOME||e.charOrCode==dojo.keys.END)&&!(e.ctrlKey||e.altKey||e.metaKey)&&typeof this.attr("value")!="undefined"){var _453=this.constraints[(e.charOrCode==dojo.keys.HOME?"min":"max")];if(_453){this._setValueAttr(_453,true);}dojo.stopEvent(e);}}});}if(!dojo._hasResource["dojo.data.util.sorter"]){dojo._hasResource["dojo.data.util.sorter"]=true;dojo.provide("dojo.data.util.sorter");dojo.data.util.sorter.basicComparator=function(a,b){var r=-1;if(a===null){a=undefined;}if(b===null){b=undefined;}if(a==b){r=0;}else{if(a>b||a==null){r=1;}}return r;};dojo.data.util.sorter.createSortFunction=function(_454,_455){var _456=[];function _457(attr,dir,comp,s){return function(_458,_459){var a=s.getValue(_458,attr);var b=s.getValue(_459,attr);return dir*comp(a,b);};};var _45a;var map=_455.comparatorMap;var bc=dojo.data.util.sorter.basicComparator;for(var i=0;i<_454.length;i++){_45a=_454[i];var attr=_45a.attribute;if(attr){var dir=(_45a.descending)?-1:1;var comp=bc;if(map){if(typeof attr!=="string"&&("toString" in attr)){attr=attr.toString();}comp=map[attr]||bc;}_456.push(_457(attr,dir,comp,_455));}}return function(rowA,rowB){var i=0;while(i<_456.length){var ret=_456[i++](rowA,rowB);if(ret!==0){return ret;}}return 0;};};}if(!dojo._hasResource["dojo.data.util.simpleFetch"]){dojo._hasResource["dojo.data.util.simpleFetch"]=true;dojo.provide("dojo.data.util.simpleFetch");dojo.data.util.simpleFetch.fetch=function(_45b){_45b=_45b||{};if(!_45b.store){_45b.store=this;}var self=this;var _45c=function(_45d,_45e){if(_45e.onError){var _45f=_45e.scope||dojo.global;_45e.onError.call(_45f,_45d,_45e);}};var _460=function(_461,_462){var _463=_462.abort||null;var _464=false;var _465=_462.start?_462.start:0;var _466=(_462.count&&(_462.count!==Infinity))?(_465+_462.count):_461.length;_462.abort=function(){_464=true;if(_463){_463.call(_462);}};var _467=_462.scope||dojo.global;if(!_462.store){_462.store=self;}if(_462.onBegin){_462.onBegin.call(_467,_461.length,_462);}if(_462.sort){_461.sort(dojo.data.util.sorter.createSortFunction(_462.sort,self));}if(_462.onItem){for(var i=_465;(i<_461.length)&&(i<_466);++i){var item=_461[i];if(!_464){_462.onItem.call(_467,item,_462);}}}if(_462.onComplete&&!_464){var _468=null;if(!_462.onItem){_468=_461.slice(_465,_466);}_462.onComplete.call(_467,_468,_462);}};this._fetchItems(_45b,_460,_45c);return _45b;};}if(!dojo._hasResource["dojo.data.util.filter"]){dojo._hasResource["dojo.data.util.filter"]=true;dojo.provide("dojo.data.util.filter");dojo.data.util.filter.patternToRegExp=function(_469,_46a){var rxp="^";var c=null;for(var i=0;i<_469.length;i++){c=_469.charAt(i);switch(c){case "\\":rxp+=c;i++;rxp+=_469.charAt(i);break;case "*":rxp+=".*";break;case "?":rxp+=".";break;case "$":case "^":case "/":case "+":case ".":case "|":case "(":case ")":case "{":case "}":case "[":case "]":rxp+="\\";default:rxp+=c;}}rxp+="$";if(_46a){return new RegExp(rxp,"mi");}else{return new RegExp(rxp,"m");}};}if(!dojo._hasResource["dijit.form.ComboBox"]){dojo._hasResource["dijit.form.ComboBox"]=true;dojo.provide("dijit.form.ComboBox");dojo.declare("dijit.form.ComboBoxMixin",null,{item:null,pageSize:Infinity,store:null,fetchProperties:{},query:{},autoComplete:true,highlightMatch:"first",searchDelay:100,searchAttr:"name",labelAttr:"",labelType:"text",queryExpr:"${0}*",ignoreCase:true,hasDownArrow:true,templateString:dojo.cache("dijit.form","templates/ComboBox.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" dojoAttachPoint=\"comboNode\" waiRole=\"combobox\" tabIndex=\"-1\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown,onmouseup:_onMouse,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input ${nameAttrSetting} type=\"text\" autocomplete=\"off\" class='dijitReset'\n\t\t\tdojoAttachEvent=\"onkeypress:_onKeyPress,compositionend\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t\t/></div\n\t></div\n></div>\n"),baseClass:"dijitComboBox",_getCaretPos:function(_46b){var pos=0;if(typeof (_46b.selectionStart)=="number"){pos=_46b.selectionStart;}else{if(dojo.isIE){var tr=dojo.doc.selection.createRange().duplicate();var ntr=_46b.createTextRange();tr.move("character",0);ntr.move("character",0);try{ntr.setEndPoint("EndToEnd",tr);pos=String(ntr.text).replace(/\r/g,"").length;}catch(e){}}}return pos;},_setCaretPos:function(_46c,_46d){_46d=parseInt(_46d);dijit.selectInputText(_46c,_46d,_46d);},_setDisabledAttr:function(_46e){this.inherited(arguments);dijit.setWaiState(this.comboNode,"disabled",_46e);},_abortQuery:function(){if(this.searchTimer){clearTimeout(this.searchTimer);this.searchTimer=null;}if(this._fetchHandle){if(this._fetchHandle.abort){this._fetchHandle.abort();}this._fetchHandle=null;}},_onKeyPress:function(evt){var key=evt.charOrCode;if(evt.altKey||((evt.ctrlKey||evt.metaKey)&&(key!="x"&&key!="v"))||key==dojo.keys.SHIFT){return;}var _46f=false;var _470="_startSearchFromInput";var pw=this._popupWidget;var dk=dojo.keys;var _471=null;this._prev_key_backspace=false;this._abortQuery();if(this._isShowingNow){pw.handleKey(key);_471=pw.getHighlightedOption();}switch(key){case dk.PAGE_DOWN:case dk.DOWN_ARROW:case dk.PAGE_UP:case dk.UP_ARROW:if(!this._isShowingNow){this._arrowPressed();_46f=true;_470="_startSearchAll";}else{this._announceOption(_471);}dojo.stopEvent(evt);break;case dk.ENTER:if(_471){if(_471==pw.nextButton){this._nextSearch(1);dojo.stopEvent(evt);break;}else{if(_471==pw.previousButton){this._nextSearch(-1);dojo.stopEvent(evt);break;}}}else{this._setBlurValue();this._setCaretPos(this.focusNode,this.focusNode.value.length);}evt.preventDefault();case dk.TAB:var _472=this.attr("displayedValue");if(pw&&(_472==pw._messages["previousMessage"]||_472==pw._messages["nextMessage"])){break;}if(_471){this._selectOption();}if(this._isShowingNow){this._lastQuery=null;this._hideResultList();}break;case " ":if(_471){dojo.stopEvent(evt);this._selectOption();this._hideResultList();}else{_46f=true;}break;case dk.ESCAPE:if(this._isShowingNow){dojo.stopEvent(evt);this._hideResultList();}break;case dk.DELETE:case dk.BACKSPACE:this._prev_key_backspace=true;_46f=true;break;default:_46f=typeof key=="string"||key==229;}if(_46f){this.item=undefined;this.searchTimer=setTimeout(dojo.hitch(this,_470),1);}},_autoCompleteText:function(text){var fn=this.focusNode;dijit.selectInputText(fn,fn.value.length);var _473=this.ignoreCase?"toLowerCase":"substr";if(text[_473](0).indexOf(this.focusNode.value[_473](0))==0){var cpos=this._getCaretPos(fn);if((cpos+1)>fn.value.length){fn.value=text;dijit.selectInputText(fn,cpos);}}else{fn.value=text;dijit.selectInputText(fn);}},_openResultList:function(_474,_475){this._fetchHandle=null;if(this.disabled||this.readOnly||(_475.query[this.searchAttr]!=this._lastQuery)){return;}this._popupWidget.clearResultList();if(!_474.length){this._hideResultList();return;}_475._maxOptions=this._maxOptions;var _476=this._popupWidget.createOptions(_474,_475,dojo.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if(_475.direction){if(1==_475.direction){this._popupWidget.highlightFirstOption();}else{if(-1==_475.direction){this._popupWidget.highlightLastOption();}}this._announceOption(this._popupWidget.getHighlightedOption());}else{if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_475.query[this.searchAttr])){this._announceOption(_476[1]);}}},_showResultList:function(){this._hideResultList();this._arrowPressed();this.displayMessage("");dojo.style(this._popupWidget.domNode,{width:"",height:""});var best=this.open();var _477=dojo.marginBox(this._popupWidget.domNode);this._popupWidget.domNode.style.overflow=((best.h==_477.h)&&(best.w==_477.w))?"hidden":"auto";var _478=best.w;if(best.h<this._popupWidget.domNode.scrollHeight){_478+=16;}dojo.marginBox(this._popupWidget.domNode,{h:best.h,w:Math.max(_478,this.domNode.offsetWidth)});if(_478<this.domNode.offsetWidth){this._popupWidget.domNode.parentNode.style.left=dojo.position(this.domNode).x+"px";}dijit.setWaiState(this.comboNode,"expanded","true");},_hideResultList:function(){this._abortQuery();if(this._isShowingNow){dijit.popup.close(this._popupWidget);this._arrowIdle();this._isShowingNow=false;dijit.setWaiState(this.comboNode,"expanded","false");dijit.removeWaiState(this.focusNode,"activedescendant");}},_setBlurValue:function(){var _479=this.attr("displayedValue");var pw=this._popupWidget;if(pw&&(_479==pw._messages["previousMessage"]||_479==pw._messages["nextMessage"])){this._setValueAttr(this._lastValueReported,true);}else{if(typeof this.item=="undefined"){this.item=null;this.attr("displayedValue",_479);}else{if(this.value!=this._lastValueReported){dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);}this._refreshState();}}},_onBlur:function(){this._hideResultList();this._arrowIdle();this.inherited(arguments);},_setItemAttr:function(item,_47a,_47b){if(!_47b){_47b=this.labelFunc(item,this.store);}this.value=this._getValueField()!=this.searchAttr?this.store.getIdentity(item):_47b;this.item=item;dijit.form.ComboBox.superclass._setValueAttr.call(this,this.value,_47a,_47b);},_announceOption:function(node){if(!node){return;}var _47c;if(node==this._popupWidget.nextButton||node==this._popupWidget.previousButton){_47c=node.innerHTML;this.item=undefined;this.value="";}else{_47c=this.labelFunc(node.item,this.store);this.attr("item",node.item,false,_47c);}this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);dijit.setWaiState(this.focusNode,"activedescendant",dojo.attr(node,"id"));this._autoCompleteText(_47c);},_selectOption:function(evt){if(evt){this._announceOption(evt.target);}this._hideResultList();this._setCaretPos(this.focusNode,this.focusNode.value.length);dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);},_onArrowMouseDown:function(evt){if(this.disabled||this.readOnly){return;}dojo.stopEvent(evt);this.focus();if(this._isShowingNow){this._hideResultList();}else{this._startSearchAll();}},_startSearchAll:function(){this._startSearch("");},_startSearchFromInput:function(){this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g,"\\$1"));},_getQueryString:function(text){return dojo.string.substitute(this.queryExpr,[text]);},_startSearch:function(key){if(!this._popupWidget){var _47d=this.id+"_popup";this._popupWidget=new dijit.form._ComboBoxMenu({onChange:dojo.hitch(this,this._selectOption),id:_47d});dijit.removeWaiState(this.focusNode,"activedescendant");dijit.setWaiState(this.textbox,"owns",_47d);}var _47e=dojo.clone(this.query);this._lastInput=key;this._lastQuery=_47e[this.searchAttr]=this._getQueryString(key);this.searchTimer=setTimeout(dojo.hitch(this,function(_47f,_480){this.searchTimer=null;var _481={queryOptions:{ignoreCase:this.ignoreCase,deep:true},query:_47f,onBegin:dojo.hitch(this,"_setMaxOptions"),onComplete:dojo.hitch(this,"_openResultList"),onError:function(_482){_480._fetchHandle=null;console.error("dijit.form.ComboBox: "+_482);dojo.hitch(_480,"_hideResultList")();},start:0,count:this.pageSize};dojo.mixin(_481,_480.fetchProperties);this._fetchHandle=_480.store.fetch(_481);var _483=function(_484,_485){_484.start+=_484.count*_485;_484.direction=_485;this._fetchHandle=this.store.fetch(_484);};this._nextSearch=this._popupWidget.onPage=dojo.hitch(this,_483,this._fetchHandle);},_47e,this),this.searchDelay);},_setMaxOptions:function(size,_486){this._maxOptions=size;},_getValueField:function(){return this.searchAttr;},_arrowPressed:function(){if(!this.disabled&&!this.readOnly&&this.hasDownArrow){dojo.addClass(this.downArrowNode,"dijitArrowButtonActive");}},_arrowIdle:function(){if(!this.disabled&&!this.readOnly&&this.hasDownArrow){dojo.removeClass(this.downArrowNode,"dojoArrowButtonPushed");}},compositionend:function(evt){this._onKeyPress({charOrCode:229});},constructor:function(){this.query={};this.fetchProperties={};},postMixInProperties:function(){if(!this.hasDownArrow){this.baseClass="dijitTextBox";}if(!this.store){var _487=this.srcNodeRef;this.store=new dijit.form._ComboBoxDataStore(_487);if(!this.value||((typeof _487.selectedIndex=="number")&&_487.selectedIndex.toString()===this.value)){var item=this.store.fetchSelectedItem();if(item){var _488=this._getValueField();this.value=_488!=this.searchAttr?this.store.getValue(item,_488):this.labelFunc(item,this.store);}}}this.inherited(arguments);},postCreate:function(){var _489=dojo.query("label[for=\""+this.id+"\"]");if(_489.length){_489[0].id=(this.id+"_label");var cn=this.comboNode;dijit.setWaiState(cn,"labelledby",_489[0].id);}this.inherited(arguments);},uninitialize:function(){if(this._popupWidget&&!this._popupWidget._destroyed){this._hideResultList();this._popupWidget.destroy();}this.inherited(arguments);},_getMenuLabelFromItem:function(item){var _48a=this.labelAttr?this.store.getValue(item,this.labelAttr):this.labelFunc(item,this.store);var _48b=this.labelType;if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){_48a=this.doHighlight(_48a,this._escapeHtml(this._lastInput));_48b="html";}return {html:_48b=="html",label:_48a};},doHighlight:function(_48c,find){var _48d="i"+(this.highlightMatch=="all"?"g":"");var _48e=this._escapeHtml(_48c);find=dojo.regexp.escapeString(find);var ret=_48e.replace(new RegExp("(^|\\s)("+find+")",_48d),"$1<span class=\"dijitComboBoxHighlightMatch\">$2</span>");return ret;},_escapeHtml:function(str){str=String(str).replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");return str;},open:function(){this._isShowingNow=true;return dijit.popup.open({popup:this._popupWidget,around:this.domNode,parent:this});},reset:function(){this.item=null;this.inherited(arguments);},labelFunc:function(item,_48f){return _48f.getValue(item,this.searchAttr).toString();}});dojo.declare("dijit.form._ComboBoxMenu",[dijit._Widget,dijit._Templated],{templateString:"<ul class='dijitReset dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' tabIndex='-1' style='overflow: \"auto\"; overflow-x: \"hidden\";'>"+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' waiRole='option'></li>"+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' waiRole='option'></li>"+"</ul>",_messages:null,postMixInProperties:function(){this._messages=dojo.i18n.getLocalization("dijit.form","ComboBox",this.lang);this.inherited(arguments);},_setValueAttr:function(_490){this.value=_490;this.onChange(_490);},onChange:function(_491){},onPage:function(_492){},postCreate:function(){this.previousButton.innerHTML=this._messages["previousMessage"];this.nextButton.innerHTML=this._messages["nextMessage"];this.inherited(arguments);},onClose:function(){this._blurOptionNode();},_createOption:function(item,_493){var _494=_493(item);var _495=dojo.doc.createElement("li");dijit.setWaiRole(_495,"option");if(_494.html){_495.innerHTML=_494.label;}else{_495.appendChild(dojo.doc.createTextNode(_494.label));}if(_495.innerHTML==""){_495.innerHTML="&nbsp;";}_495.item=item;return _495;},createOptions:function(_496,_497,_498){this.previousButton.style.display=(_497.start==0)?"none":"";dojo.attr(this.previousButton,"id",this.id+"_prev");dojo.forEach(_496,function(item,i){var _499=this._createOption(item,_498);_499.className="dijitReset dijitMenuItem";dojo.attr(_499,"id",this.id+i);this.domNode.insertBefore(_499,this.nextButton);},this);var _49a=false;if(_497._maxOptions&&_497._maxOptions!=-1){if((_497.start+_497.count)<_497._maxOptions){_49a=true;}else{if((_497.start+_497.count)>(_497._maxOptions-1)){if(_497.count==_496.length){_49a=true;}}}}else{if(_497.count==_496.length){_49a=true;}}this.nextButton.style.display=_49a?"":"none";dojo.attr(this.nextButton,"id",this.id+"_next");return this.domNode.childNodes;},clearResultList:function(){while(this.domNode.childNodes.length>2){this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);}},_onMouseDown:function(evt){dojo.stopEvent(evt);},_onMouseUp:function(evt){if(evt.target===this.domNode){return;}else{if(evt.target==this.previousButton){this.onPage(-1);}else{if(evt.target==this.nextButton){this.onPage(1);}else{var tgt=evt.target;while(!tgt.item){tgt=tgt.parentNode;}this._setValueAttr({target:tgt},true);}}}},_onMouseOver:function(evt){if(evt.target===this.domNode){return;}var tgt=evt.target;if(!(tgt==this.previousButton||tgt==this.nextButton)){while(!tgt.item){tgt=tgt.parentNode;}}this._focusOptionNode(tgt);},_onMouseOut:function(evt){if(evt.target===this.domNode){return;}this._blurOptionNode();},_focusOptionNode:function(node){if(this._highlighted_option!=node){this._blurOptionNode();this._highlighted_option=node;dojo.addClass(this._highlighted_option,"dijitMenuItemSelected");}},_blurOptionNode:function(){if(this._highlighted_option){dojo.removeClass(this._highlighted_option,"dijitMenuItemSelected");this._highlighted_option=null;}},_highlightNextOption:function(){var fc=this.domNode.firstChild;if(!this.getHighlightedOption()){this._focusOptionNode(fc.style.display=="none"?fc.nextSibling:fc);}else{var ns=this._highlighted_option.nextSibling;if(ns&&ns.style.display!="none"){this._focusOptionNode(ns);}}dijit.scrollIntoView(this._highlighted_option);},highlightFirstOption:function(){this._focusOptionNode(this.domNode.firstChild.nextSibling);dijit.scrollIntoView(this._highlighted_option);},highlightLastOption:function(){this._focusOptionNode(this.domNode.lastChild.previousSibling);dijit.scrollIntoView(this._highlighted_option);},_highlightPrevOption:function(){var lc=this.domNode.lastChild;if(!this.getHighlightedOption()){this._focusOptionNode(lc.style.display=="none"?lc.previousSibling:lc);}else{var ps=this._highlighted_option.previousSibling;if(ps&&ps.style.display!="none"){this._focusOptionNode(ps);}}dijit.scrollIntoView(this._highlighted_option);},_page:function(up){var _49b=0;var _49c=this.domNode.scrollTop;var _49d=dojo.style(this.domNode,"height");if(!this.getHighlightedOption()){this._highlightNextOption();}while(_49b<_49d){if(up){if(!this.getHighlightedOption().previousSibling||this._highlighted_option.previousSibling.style.display=="none"){break;}this._highlightPrevOption();}else{if(!this.getHighlightedOption().nextSibling||this._highlighted_option.nextSibling.style.display=="none"){break;}this._highlightNextOption();}var _49e=this.domNode.scrollTop;_49b+=(_49e-_49c)*(up?-1:1);_49c=_49e;}},pageUp:function(){this._page(true);},pageDown:function(){this._page(false);},getHighlightedOption:function(){var ho=this._highlighted_option;return (ho&&ho.parentNode)?ho:null;},handleKey:function(key){switch(key){case dojo.keys.DOWN_ARROW:this._highlightNextOption();break;case dojo.keys.PAGE_DOWN:this.pageDown();break;case dojo.keys.UP_ARROW:this._highlightPrevOption();break;case dojo.keys.PAGE_UP:this.pageUp();break;}}});dojo.declare("dijit.form.ComboBox",[dijit.form.ValidationTextBox,dijit.form.ComboBoxMixin],{_setValueAttr:function(_49f,_4a0,_4a1){this.item=null;if(!_49f){_49f="";}dijit.form.ValidationTextBox.prototype._setValueAttr.call(this,_49f,_4a0,_4a1);}});dojo.declare("dijit.form._ComboBoxDataStore",null,{constructor:function(root){this.root=root;dojo.query("> option",root).forEach(function(node){node.innerHTML=dojo.trim(node.innerHTML);});},getValue:function(item,_4a2,_4a3){return (_4a2=="value")?item.value:(item.innerText||item.textContent||"");},isItemLoaded:function(_4a4){return true;},getFeatures:function(){return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true};},_fetchItems:function(args,_4a5,_4a6){if(!args.query){args.query={};}if(!args.query.name){args.query.name="";}if(!args.queryOptions){args.queryOptions={};}var _4a7=dojo.data.util.filter.patternToRegExp(args.query.name,args.queryOptions.ignoreCase),_4a8=dojo.query("> option",this.root).filter(function(_4a9){return (_4a9.innerText||_4a9.textContent||"").match(_4a7);});if(args.sort){_4a8.sort(dojo.data.util.sorter.createSortFunction(args.sort,this));}_4a5(_4a8,args);},close:function(_4aa){return;},getLabel:function(item){return item.innerHTML;},getIdentity:function(item){return dojo.attr(item,"value");},fetchItemByIdentity:function(args){var item=dojo.query("option[value='"+args.identity+"']",this.root)[0];args.onItem(item);},fetchSelectedItem:function(){var root=this.root,si=root.selectedIndex;return dojo.query("> option:nth-child("+(si!=-1?si+1:1)+")",root)[0];}});dojo.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch);}if(!dojo._hasResource["dijit.form.FilteringSelect"]){dojo._hasResource["dijit.form.FilteringSelect"]=true;dojo.provide("dijit.form.FilteringSelect");dojo.declare("dijit.form.FilteringSelect",[dijit.form.MappedTextBox,dijit.form.ComboBoxMixin],{_isvalid:true,required:true,_lastDisplayedValue:"",isValid:function(){return this._isvalid||(!this.required&&this.attr("displayedValue")=="");},_callbackSetLabel:function(_4ab,_4ac,_4ad){if((_4ac&&_4ac.query[this.searchAttr]!=this._lastQuery)||(!_4ac&&_4ab.length&&this.store.getIdentity(_4ab[0])!=this._lastQuery)){return;}if(!_4ab.length){this.valueNode.value="";dijit.form.TextBox.superclass._setValueAttr.call(this,"",_4ad||(_4ad===undefined&&!this._focused));this._isvalid=false;this.validate(this._focused);this.item=null;}else{this.attr("item",_4ab[0],_4ad);}},_openResultList:function(_4ae,_4af){if(_4af.query[this.searchAttr]!=this._lastQuery){return;}this._isvalid=_4ae.length!=0;this.validate(true);dijit.form.ComboBoxMixin.prototype._openResultList.apply(this,arguments);},_getValueAttr:function(){return this.valueNode.value;},_getValueField:function(){return "value";},_setValueAttr:function(_4b0,_4b1){if(!this._onChangeActive){_4b1=null;}this._lastQuery=_4b0;if(_4b0===null||_4b0===""){this._setDisplayedValueAttr("",_4b1);return;}var self=this;this.store.fetchItemByIdentity({identity:_4b0,onItem:function(item){self._callbackSetLabel([item],undefined,_4b1);}});},_setItemAttr:function(item,_4b2,_4b3){this._isvalid=true;this.inherited(arguments);this.valueNode.value=this.value;this._lastDisplayedValue=this.textbox.value;},_getDisplayQueryString:function(text){return text.replace(/([\\\*\?])/g,"\\$1");},_setDisplayedValueAttr:function(_4b4,_4b5){if(!this._created){_4b5=false;}if(this.store){this._hideResultList();var _4b6=dojo.clone(this.query);this._lastQuery=_4b6[this.searchAttr]=this._getDisplayQueryString(_4b4);this.textbox.value=_4b4;this._lastDisplayedValue=_4b4;var _4b7=this;var _4b8={query:_4b6,queryOptions:{ignoreCase:this.ignoreCase,deep:true},onComplete:function(_4b9,_4ba){_4b7._fetchHandle=null;dojo.hitch(_4b7,"_callbackSetLabel")(_4b9,_4ba,_4b5);},onError:function(_4bb){_4b7._fetchHandle=null;console.error("dijit.form.FilteringSelect: "+_4bb);dojo.hitch(_4b7,"_callbackSetLabel")([],undefined,false);}};dojo.mixin(_4b8,this.fetchProperties);this._fetchHandle=this.store.fetch(_4b8);}},postMixInProperties:function(){this.inherited(arguments);this._isvalid=!this.required;},undo:function(){this.attr("displayedValue",this._lastDisplayedValue);}});}if(!dojo._hasResource["dijit.form.MultiSelect"]){dojo._hasResource["dijit.form.MultiSelect"]=true;dojo.provide("dijit.form.MultiSelect");dojo.declare("dijit.form.MultiSelect",dijit.form._FormValueWidget,{size:7,templateString:"<select multiple='true' ${nameAttrSetting} dojoAttachPoint='containerNode,focusNode' dojoAttachEvent='onchange: _onChange'></select>",attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{size:"focusNode"}),reset:function(){this._hasBeenBlurred=false;this._setValueAttr(this._resetValue,true);},addSelected:function(_4bc){_4bc.getSelected().forEach(function(n){this.containerNode.appendChild(n);this.domNode.scrollTop=this.domNode.offsetHeight;var _4bd=_4bc.domNode.scrollTop;_4bc.domNode.scrollTop=0;_4bc.domNode.scrollTop=_4bd;},this);},getSelected:function(){return dojo.query("option",this.containerNode).filter(function(n){return n.selected;});},_getValueAttr:function(){return this.getSelected().map(function(n){return n.value;});},multiple:true,_setValueAttr:function(_4be){dojo.query("option",this.containerNode).forEach(function(n){n.selected=(dojo.indexOf(_4be,n.value)!=-1);});},invertSelection:function(_4bf){dojo.query("option",this.containerNode).forEach(function(n){n.selected=!n.selected;});this._handleOnChange(this.attr("value"),_4bf==true);},_onChange:function(e){this._handleOnChange(this.attr("value"),true);},resize:function(size){if(size){dojo.marginBox(this.domNode,size);}},postCreate:function(){this._onChange();}});}if(!dojo._hasResource["dijit.form.HorizontalSlider"]){dojo._hasResource["dijit.form.HorizontalSlider"]=true;dojo.provide("dijit.form.HorizontalSlider");dojo.declare("dijit.form.HorizontalSlider",[dijit.form._FormValueWidget,dijit._Container],{templateString:dojo.cache("dijit.form","templates/HorizontalSlider.html","<table class=\"dijit dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"topDecoration\" class=\"dijitReset\" style=\"text-align:center;width:100%;\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderDecrementIconH\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"decrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper dijitSliderLeftBumper\" dojoAttachEvent=\"onmousedown:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" ${nameAttrSetting}\n\t\t\t/><div class=\"dijitReset dijitSliderBarContainerH\" waiRole=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" dojoAttachEvent=\"onmousedown:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableH\"\n\t\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleH\" dojoAttachEvent=\"onmousedown:_onHandleClick\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" dojoAttachEvent=\"onmousedown:_onBarClick\"></div\n\t\t\t></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper dijitSliderRightBumper\" dojoAttachEvent=\"onmousedown:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\" style=\"right:0px;\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"incrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"containerNode,bottomDecoration\" class=\"dijitReset\" style=\"text-align:center;\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n"),value:0,showButtons:true,minimum:0,maximum:100,discreteValues:Infinity,pageIncrement:2,clickSelect:true,slideDuration:dijit.defaultDuration,widgetsInTemplate:true,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{id:""}),baseClass:"dijitSlider",_mousePixelCoord:"pageX",_pixelCount:"w",_startingPixelCoord:"x",_startingPixelCount:"l",_handleOffsetCoord:"left",_progressPixelSize:"width",_onKeyUp:function(e){if(this.disabled||this.readOnly||e.altKey||e.ctrlKey||e.metaKey){return;}this._setValueAttr(this.value,true);},_onKeyPress:function(e){if(this.disabled||this.readOnly||e.altKey||e.ctrlKey||e.metaKey){return;}switch(e.charOrCode){case dojo.keys.HOME:this._setValueAttr(this.minimum,false);break;case dojo.keys.END:this._setValueAttr(this.maximum,false);break;case ((this._descending||this.isLeftToRight())?dojo.keys.RIGHT_ARROW:dojo.keys.LEFT_ARROW):case (this._descending===false?dojo.keys.DOWN_ARROW:dojo.keys.UP_ARROW):case (this._descending===false?dojo.keys.PAGE_DOWN:dojo.keys.PAGE_UP):this.increment(e);break;case ((this._descending||this.isLeftToRight())?dojo.keys.LEFT_ARROW:dojo.keys.RIGHT_ARROW):case (this._descending===false?dojo.keys.UP_ARROW:dojo.keys.DOWN_ARROW):case (this._descending===false?dojo.keys.PAGE_UP:dojo.keys.PAGE_DOWN):this.decrement(e);break;default:return;}dojo.stopEvent(e);},_onHandleClick:function(e){if(this.disabled||this.readOnly){return;}if(!dojo.isIE){dijit.focus(this.sliderHandle);}dojo.stopEvent(e);},_isReversed:function(){return !this.isLeftToRight();},_onBarClick:function(e){if(this.disabled||this.readOnly||!this.clickSelect){return;}dijit.focus(this.sliderHandle);dojo.stopEvent(e);var _4c0=dojo.position(this.sliderBarContainer,true);var _4c1=e[this._mousePixelCoord]-_4c0[this._startingPixelCoord];this._setPixelValue(this._isReversed()?(_4c0[this._pixelCount]-_4c1):_4c1,_4c0[this._pixelCount],true);this._movable.onMouseDown(e);},_setPixelValue:function(_4c2,_4c3,_4c4){if(this.disabled||this.readOnly){return;}_4c2=_4c2<0?0:_4c3<_4c2?_4c3:_4c2;var _4c5=this.discreteValues;if(_4c5<=1||_4c5==Infinity){_4c5=_4c3;}_4c5--;var _4c6=_4c3/_4c5;var _4c7=Math.round(_4c2/_4c6);this._setValueAttr((this.maximum-this.minimum)*_4c7/_4c5+this.minimum,_4c4);},_setValueAttr:function(_4c8,_4c9){this.valueNode.value=this.value=_4c8;dijit.setWaiState(this.focusNode,"valuenow",_4c8);this.inherited(arguments);var _4ca=(_4c8-this.minimum)/(this.maximum-this.minimum);var _4cb=(this._descending===false)?this.remainingBar:this.progressBar;var _4cc=(this._descending===false)?this.progressBar:this.remainingBar;if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){this._inProgressAnim.stop(true);}if(_4c9&&this.slideDuration>0&&_4cb.style[this._progressPixelSize]){var _4cd=this;var _4ce={};var _4cf=parseFloat(_4cb.style[this._progressPixelSize]);var _4d0=this.slideDuration*(_4ca-_4cf/100);if(_4d0==0){return;}if(_4d0<0){_4d0=0-_4d0;}_4ce[this._progressPixelSize]={start:_4cf,end:_4ca*100,units:"%"};this._inProgressAnim=dojo.animateProperty({node:_4cb,duration:_4d0,onAnimate:function(v){_4cc.style[_4cd._progressPixelSize]=(100-parseFloat(v[_4cd._progressPixelSize]))+"%";},onEnd:function(){delete _4cd._inProgressAnim;},properties:_4ce});this._inProgressAnim.play();}else{_4cb.style[this._progressPixelSize]=(_4ca*100)+"%";_4cc.style[this._progressPixelSize]=((1-_4ca)*100)+"%";}},_bumpValue:function(_4d1,_4d2){if(this.disabled||this.readOnly){return;}var s=dojo.getComputedStyle(this.sliderBarContainer);var c=dojo._getContentBox(this.sliderBarContainer,s);var _4d3=this.discreteValues;if(_4d3<=1||_4d3==Infinity){_4d3=c[this._pixelCount];}_4d3--;var _4d4=(this.value-this.minimum)*_4d3/(this.maximum-this.minimum)+_4d1;if(_4d4<0){_4d4=0;}if(_4d4>_4d3){_4d4=_4d3;}_4d4=_4d4*(this.maximum-this.minimum)/_4d3+this.minimum;this._setValueAttr(_4d4,_4d2);},_onClkBumper:function(val){if(this.disabled||this.readOnly||!this.clickSelect){return;}this._setValueAttr(val,true);},_onClkIncBumper:function(){this._onClkBumper(this._descending===false?this.minimum:this.maximum);},_onClkDecBumper:function(){this._onClkBumper(this._descending===false?this.maximum:this.minimum);},decrement:function(e){this._bumpValue(e.charOrCode==dojo.keys.PAGE_DOWN?-this.pageIncrement:-1);},increment:function(e){this._bumpValue(e.charOrCode==dojo.keys.PAGE_UP?this.pageIncrement:1);},_mouseWheeled:function(evt){dojo.stopEvent(evt);var _4d5=!dojo.isMozilla;var _4d6=evt[(_4d5?"wheelDelta":"detail")]*(_4d5?1:-1);this._bumpValue(_4d6<0?-1:1,true);},startup:function(){dojo.forEach(this.getChildren(),function(_4d7){if(this[_4d7.container]!=this.containerNode){this[_4d7.container].appendChild(_4d7.domNode);}},this);},_typematicCallback:function(_4d8,_4d9,e){if(_4d8==-1){this._setValueAttr(this.value,true);}else{this[(_4d9==(this._descending?this.incrementButton:this.decrementButton))?"decrement":"increment"](e);}},postCreate:function(){if(this.showButtons){this.incrementButton.style.display="";this.decrementButton.style.display="";this._connects.push(dijit.typematic.addMouseListener(this.decrementButton,this,"_typematicCallback",25,500));this._connects.push(dijit.typematic.addMouseListener(this.incrementButton,this,"_typematicCallback",25,500));}this.connect(this.domNode,!dojo.isMozilla?"onmousewheel":"DOMMouseScroll","_mouseWheeled");var _4da=dojo.declare(dijit.form._SliderMover,{widget:this});this._movable=new dojo.dnd.Moveable(this.sliderHandle,{mover:_4da});var _4db=dojo.query("label[for=\""+this.id+"\"]");if(_4db.length){_4db[0].id=(this.id+"_label");dijit.setWaiState(this.focusNode,"labelledby",_4db[0].id);}dijit.setWaiState(this.focusNode,"valuemin",this.minimum);dijit.setWaiState(this.focusNode,"valuemax",this.maximum);this.inherited(arguments);this._layoutHackIE7();},destroy:function(){this._movable.destroy();if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){this._inProgressAnim.stop(true);}this._supportingWidgets=dijit.findWidgets(this.domNode);this.inherited(arguments);}});dojo.declare("dijit.form._SliderMover",dojo.dnd.Mover,{onMouseMove:function(e){var _4dc=this.widget;var _4dd=_4dc._abspos;if(!_4dd){_4dd=_4dc._abspos=dojo.position(_4dc.sliderBarContainer,true);_4dc._setPixelValue_=dojo.hitch(_4dc,"_setPixelValue");_4dc._isReversed_=_4dc._isReversed();}var _4de=e[_4dc._mousePixelCoord]-_4dd[_4dc._startingPixelCoord];_4dc._setPixelValue_(_4dc._isReversed_?(_4dd[_4dc._pixelCount]-_4de):_4de,_4dd[_4dc._pixelCount],false);},destroy:function(e){dojo.dnd.Mover.prototype.destroy.apply(this,arguments);var _4df=this.widget;_4df._abspos=null;_4df._setValueAttr(_4df.value,true);}});}if(!dojo._hasResource["dijit.form.VerticalSlider"]){dojo._hasResource["dijit.form.VerticalSlider"]=true;dojo.provide("dijit.form.VerticalSlider");dojo.declare("dijit.form.VerticalSlider",dijit.form.HorizontalSlider,{templateString:dojo.cache("dijit.form","templates/VerticalSlider.html","<table class=\"dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n><tbody class=\"dijitReset\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderIncrementIconV\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"decrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper dijitSliderTopBumper\" dojoAttachEvent=\"onmousedown:_onClkIncBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td dojoAttachPoint=\"leftDecoration\" class=\"dijitReset\" style=\"text-align:center;height:100%;\"></td\n\t\t><td class=\"dijitReset\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" ${nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" waiRole=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onmousedown:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" dojoAttachEvent=\"onmousedown:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable\" style=\"vertical-align:top;\"\n\t\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleV\" dojoAttachEvent=\"onmousedown:_onHandleClick\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t></center\n\t\t></td\n\t\t><td dojoAttachPoint=\"containerNode,rightDecoration\" class=\"dijitReset\" style=\"text-align:center;height:100%;\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper dijitSliderBottomBumper\" dojoAttachEvent=\"onmousedown:_onClkDecBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderDecrementIconV\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"incrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></tbody></table>\n"),_mousePixelCoord:"pageY",_pixelCount:"h",_startingPixelCoord:"y",_startingPixelCount:"t",_handleOffsetCoord:"top",_progressPixelSize:"height",_descending:true,startup:function(){if(this._started){return;}if(!this.isLeftToRight()&&dojo.isMoz){if(this.leftDecoration){this._rtlRectify(this.leftDecoration);}if(this.rightDecoration){this._rtlRectify(this.rightDecoration);}}this.inherited(arguments);},_isReversed:function(){return this._descending;},_rtlRectify:function(_4e0){var _4e1=[];while(_4e0.firstChild){_4e1.push(_4e0.firstChild);_4e0.removeChild(_4e0.firstChild);}for(var i=_4e1.length-1;i>=0;i--){if(_4e1[i]){_4e0.appendChild(_4e1[i]);}}}});}if(!dojo._hasResource["dijit.form.HorizontalRule"]){dojo._hasResource["dijit.form.HorizontalRule"]=true;dojo.provide("dijit.form.HorizontalRule");dojo.declare("dijit.form.HorizontalRule",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH\"></div>",count:3,container:"containerNode",ruleStyle:"",_positionPrefix:"<div class=\"dijitRuleMark dijitRuleMarkH\" style=\"left:",_positionSuffix:"%;",_suffix:"\"></div>",_genHTML:function(pos,ndx){return this._positionPrefix+pos+this._positionSuffix+this.ruleStyle+this._suffix;},_isHorizontal:true,postCreate:function(){var _4e2;if(this.count==1){_4e2=this._genHTML(50,0);}else{var i;var _4e3=100/(this.count-1);if(!this._isHorizontal||this.isLeftToRight()){_4e2=this._genHTML(0,0);for(i=1;i<this.count-1;i++){_4e2+=this._genHTML(_4e3*i,i);}_4e2+=this._genHTML(100,this.count-1);}else{_4e2=this._genHTML(100,0);for(i=1;i<this.count-1;i++){_4e2+=this._genHTML(100-_4e3*i,i);}_4e2+=this._genHTML(0,this.count-1);}}this.domNode.innerHTML=_4e2;}});}if(!dojo._hasResource["dijit.form.VerticalRule"]){dojo._hasResource["dijit.form.VerticalRule"]=true;dojo.provide("dijit.form.VerticalRule");dojo.declare("dijit.form.VerticalRule",dijit.form.HorizontalRule,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleMark dijitRuleMarkV\" style=\"top:",_isHorizontal:false});}if(!dojo._hasResource["dijit.form.HorizontalRuleLabels"]){dojo._hasResource["dijit.form.HorizontalRuleLabels"]=true;dojo.provide("dijit.form.HorizontalRuleLabels");dojo.declare("dijit.form.HorizontalRuleLabels",dijit.form.HorizontalRule,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH dijitRuleLabelsContainer dijitRuleLabelsContainerH\"></div>",labelStyle:"",labels:[],numericMargin:0,minimum:0,maximum:1,constraints:{pattern:"#%"},_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerH\" style=\"left:",_labelPrefix:"\"><span class=\"dijitRuleLabel dijitRuleLabelH\">",_suffix:"</span></div>",_calcPosition:function(pos){return pos;},_genHTML:function(pos,ndx){return this._positionPrefix+this._calcPosition(pos)+this._positionSuffix+this.labelStyle+this._labelPrefix+this.labels[ndx]+this._suffix;},getLabels:function(){var _4e4=this.labels;if(!_4e4.length){_4e4=dojo.query("> li",this.srcNodeRef).map(function(node){return String(node.innerHTML);});}this.srcNodeRef.innerHTML="";if(!_4e4.length&&this.count>1){var _4e5=this.minimum;var inc=(this.maximum-_4e5)/(this.count-1);for(var i=0;i<this.count;i++){_4e4.push((i<this.numericMargin||i>=(this.count-this.numericMargin))?"":dojo.number.format(_4e5,this.constraints));_4e5+=inc;}}return _4e4;},postMixInProperties:function(){this.inherited(arguments);this.labels=this.getLabels();this.count=this.labels.length;}});}if(!dojo._hasResource["dijit.form.VerticalRuleLabels"]){dojo._hasResource["dijit.form.VerticalRuleLabels"]=true;dojo.provide("dijit.form.VerticalRuleLabels");dojo.declare("dijit.form.VerticalRuleLabels",dijit.form.HorizontalRuleLabels,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV dijitRuleLabelsContainer dijitRuleLabelsContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerV\" style=\"top:",_labelPrefix:"\"><span class=\"dijitRuleLabel dijitRuleLabelV\">",_calcPosition:function(pos){return 100-pos;}});}if(!dojo._hasResource["dijit.form.SimpleTextarea"]){dojo._hasResource["dijit.form.SimpleTextarea"]=true;dojo.provide("dijit.form.SimpleTextarea");dojo.declare("dijit.form.SimpleTextarea",dijit.form.TextBox,{baseClass:"dijitTextArea",attributeMap:dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap,{rows:"textbox",cols:"textbox"}),rows:"3",cols:"20",templateString:"<textarea ${nameAttrSetting} dojoAttachPoint='focusNode,containerNode,textbox' autocomplete='off'></textarea>",postMixInProperties:function(){if(!this.value&&this.srcNodeRef){this.value=this.srcNodeRef.value;}this.inherited(arguments);},filter:function(_4e6){if(_4e6){_4e6=_4e6.replace(/\r/g,"");}return this.inherited(arguments);},postCreate:function(){this.inherited(arguments);if(dojo.isIE&&this.cols){dojo.addClass(this.textbox,"dijitTextAreaCols");}},_previousValue:"",_onInput:function(e){if(this.maxLength){var _4e7=parseInt(this.maxLength);var _4e8=this.textbox.value.replace(/\r/g,"");var _4e9=_4e8.length-_4e7;if(_4e9>0){if(e){dojo.stopEvent(e);}var _4ea=this.textbox;if(_4ea.selectionStart){var pos=_4ea.selectionStart;var cr=0;if(dojo.isOpera){cr=(this.textbox.value.substring(0,pos).match(/\r/g)||[]).length;}this.textbox.value=_4e8.substring(0,pos-_4e9-cr)+_4e8.substring(pos-cr);_4ea.setSelectionRange(pos-_4e9,pos-_4e9);}else{if(dojo.doc.selection){_4ea.focus();var _4eb=dojo.doc.selection.createRange();_4eb.moveStart("character",-_4e9);_4eb.text="";_4eb.select();}}}this._previousValue=this.textbox.value;}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.form.Textarea"]){dojo._hasResource["dijit.form.Textarea"]=true;dojo.provide("dijit.form.Textarea");dojo.declare("dijit.form.Textarea",dijit.form.SimpleTextarea,{cols:"",_previousNewlines:0,_strictMode:(dojo.doc.compatMode!="BackCompat"),_getHeight:function(_4ec){var newH=_4ec.scrollHeight;if(dojo.isIE){newH+=_4ec.offsetHeight-_4ec.clientHeight-((dojo.isIE<8&&this._strictMode)?dojo._getPadBorderExtents(_4ec).h:0);}else{if(dojo.isMoz){newH+=_4ec.offsetHeight-_4ec.clientHeight;}else{if(dojo.isWebKit&&!(dojo.isSafari<4)){newH+=dojo._getBorderExtents(_4ec).h;}else{newH+=dojo._getPadBorderExtents(_4ec).h;}}}return newH;},_estimateHeight:function(_4ed){_4ed.style.maxHeight="";_4ed.style.height="auto";_4ed.rows=(_4ed.value.match(/\n/g)||[]).length+1;},_needsHelpShrinking:dojo.isMoz||dojo.isWebKit,_onInput:function(){this.inherited(arguments);if(this._busyResizing){return;}this._busyResizing=true;var _4ee=this.textbox;if(_4ee.scrollHeight&&_4ee.offsetHeight&&_4ee.clientHeight){var newH=this._getHeight(_4ee)+"px";if(_4ee.style.height!=newH){_4ee.style.maxHeight=_4ee.style.height=newH;}if(this._needsHelpShrinking){if(this._setTimeoutHandle){clearTimeout(this._setTimeoutHandle);}this._setTimeoutHandle=setTimeout(dojo.hitch(this,"_shrink"),0);}}else{this._estimateHeight(_4ee);}this._busyResizing=false;},_busyResizing:false,_shrink:function(){this._setTimeoutHandle=null;if(this._needsHelpShrinking&&!this._busyResizing){this._busyResizing=true;var _4ef=this.textbox;var _4f0=false;if(_4ef.value==""){_4ef.value=" ";_4f0=true;}var _4f1=_4ef.scrollHeight;if(!_4f1){this._estimateHeight(_4ef);}else{var _4f2=_4ef.style.paddingBottom;var _4f3=dojo._getPadExtents(_4ef);_4f3=_4f3.h-_4f3.t;_4ef.style.paddingBottom=_4f3+1+"px";var newH=this._getHeight(_4ef)-1+"px";if(_4ef.style.maxHeight!=newH){_4ef.style.paddingBottom=_4f3+_4f1+"px";_4ef.scrollTop=0;_4ef.style.maxHeight=this._getHeight(_4ef)-_4f1+"px";}_4ef.style.paddingBottom=_4f2;}if(_4f0){_4ef.value="";}this._busyResizing=false;}},resize:function(){this._onInput();},_setValueAttr:function(){this.inherited(arguments);this.resize();},postCreate:function(){this.inherited(arguments);dojo.style(this.textbox,{overflowY:"hidden",overflowX:"auto",boxSizing:"border-box",MsBoxSizing:"border-box",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box"});this.connect(this.textbox,"onscroll",this._onInput);this.connect(this.textbox,"onresize",this._onInput);this.connect(this.textbox,"onfocus",this._onInput);setTimeout(dojo.hitch(this,"resize"),0);}});}if(!dojo._hasResource["dijit.layout.StackController"]){dojo._hasResource["dijit.layout.StackController"]=true;dojo.provide("dijit.layout.StackController");dojo.declare("dijit.layout.StackController",[dijit._Widget,dijit._Templated,dijit._Container],{templateString:"<span wairole='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",containerId:"",buttonWidget:"dijit.layout._StackButton",postCreate:function(){dijit.setWaiRole(this.domNode,"tablist");this.pane2button={};this.pane2handles={};this.subscribe(this.containerId+"-startup","onStartup");this.subscribe(this.containerId+"-addChild","onAddChild");this.subscribe(this.containerId+"-removeChild","onRemoveChild");this.subscribe(this.containerId+"-selectChild","onSelectChild");this.subscribe(this.containerId+"-containerKeyPress","onContainerKeyPress");},onStartup:function(info){dojo.forEach(info.children,this.onAddChild,this);if(info.selected){this.onSelectChild(info.selected);}},destroy:function(){for(var pane in this.pane2button){this.onRemoveChild(dijit.byId(pane));}this.inherited(arguments);},onAddChild:function(page,_4f4){var _4f5=dojo.doc.createElement("span");this.domNode.appendChild(_4f5);var cls=dojo.getObject(this.buttonWidget);var _4f6=new cls({id:this.id+"_"+page.id,label:page.title,showLabel:page.showTitle,iconClass:page.iconClass,closeButton:page.closable,title:page.tooltip},_4f5);dijit.setWaiState(_4f6.focusNode,"selected","false");this.pane2handles[page.id]=[this.connect(page,"attr",function(name,_4f7){if(arguments.length==2){var _4f8={title:"label",showTitle:"showLabel",iconClass:"iconClass",closable:"closeButton",tooltip:"title"}[name];if(_4f8){_4f6.attr(_4f8,_4f7);}}}),this.connect(_4f6,"onClick",dojo.hitch(this,"onButtonClick",page)),this.connect(_4f6,"onClickCloseButton",dojo.hitch(this,"onCloseButtonClick",page))];this.addChild(_4f6,_4f4);this.pane2button[page.id]=_4f6;page.controlButton=_4f6;if(!this._currentChild){_4f6.focusNode.setAttribute("tabIndex","0");dijit.setWaiState(_4f6.focusNode,"selected","true");this._currentChild=page;}if(!this.isLeftToRight()&&dojo.isIE&&this._rectifyRtlTabList){this._rectifyRtlTabList();}},onRemoveChild:function(page){if(this._currentChild===page){this._currentChild=null;}dojo.forEach(this.pane2handles[page.id],this.disconnect,this);delete this.pane2handles[page.id];var _4f9=this.pane2button[page.id];if(_4f9){this.removeChild(_4f9);delete this.pane2button[page.id];_4f9.destroy();}delete page.controlButton;},onSelectChild:function(page){if(!page){return;}if(this._currentChild){var _4fa=this.pane2button[this._currentChild.id];_4fa.attr("checked",false);dijit.setWaiState(_4fa.focusNode,"selected","false");_4fa.focusNode.setAttribute("tabIndex","-1");}var _4fb=this.pane2button[page.id];_4fb.attr("checked",true);dijit.setWaiState(_4fb.focusNode,"selected","true");this._currentChild=page;_4fb.focusNode.setAttribute("tabIndex","0");var _4fc=dijit.byId(this.containerId);dijit.setWaiState(_4fc.containerNode,"labelledby",_4fb.id);},onButtonClick:function(page){var _4fd=dijit.byId(this.containerId);_4fd.selectChild(page);},onCloseButtonClick:function(page){var _4fe=dijit.byId(this.containerId);_4fe.closeChild(page);if(this._currentChild){var b=this.pane2button[this._currentChild.id];if(b){dijit.focus(b.focusNode||b.domNode);}}},adjacent:function(_4ff){if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){_4ff=!_4ff;}var _500=this.getChildren();var _501=dojo.indexOf(_500,this.pane2button[this._currentChild.id]);var _502=_4ff?1:_500.length-1;return _500[(_501+_502)%_500.length];},onkeypress:function(e){if(this.disabled||e.altKey){return;}var _503=null;if(e.ctrlKey||!e._djpage){var k=dojo.keys;switch(e.charOrCode){case k.LEFT_ARROW:case k.UP_ARROW:if(!e._djpage){_503=false;}break;case k.PAGE_UP:if(e.ctrlKey){_503=false;}break;case k.RIGHT_ARROW:case k.DOWN_ARROW:if(!e._djpage){_503=true;}break;case k.PAGE_DOWN:if(e.ctrlKey){_503=true;}break;case k.DELETE:if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}dojo.stopEvent(e);break;default:if(e.ctrlKey){if(e.charOrCode===k.TAB){this.adjacent(!e.shiftKey).onClick();dojo.stopEvent(e);}else{if(e.charOrCode=="w"){if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}dojo.stopEvent(e);}}}}if(_503!==null){this.adjacent(_503).onClick();dojo.stopEvent(e);}}},onContainerKeyPress:function(info){info.e._djpage=info.page;this.onkeypress(info.e);}});dojo.declare("dijit.layout._StackButton",dijit.form.ToggleButton,{tabIndex:"-1",postCreate:function(evt){dijit.setWaiRole((this.focusNode||this.domNode),"tab");this.inherited(arguments);},onClick:function(evt){dijit.focus(this.focusNode);},onClickCloseButton:function(evt){evt.stopPropagation();}});}if(!dojo._hasResource["dijit.layout.StackContainer"]){dojo._hasResource["dijit.layout.StackContainer"]=true;dojo.provide("dijit.layout.StackContainer");dojo.declare("dijit.layout.StackContainer",dijit.layout._LayoutWidget,{doLayout:true,persist:false,baseClass:"dijitStackContainer",postCreate:function(){this.inherited(arguments);dojo.addClass(this.domNode,"dijitLayoutContainer");dijit.setWaiRole(this.containerNode,"tabpanel");this.connect(this.domNode,"onkeypress",this._onKeyPress);},startup:function(){if(this._started){return;}var _504=this.getChildren();dojo.forEach(_504,this._setupChild,this);if(this.persist){this.selectedChildWidget=dijit.byId(dojo.cookie(this.id+"_selectedChild"));}else{dojo.some(_504,function(_505){if(_505.selected){this.selectedChildWidget=_505;}return _505.selected;},this);}var _506=this.selectedChildWidget;if(!_506&&_504[0]){_506=this.selectedChildWidget=_504[0];_506.selected=true;}dojo.publish(this.id+"-startup",[{children:_504,selected:_506}]);this.inherited(arguments);},resize:function(){var _507=this.selectedChildWidget;if(_507&&!this._hasBeenShown){this._hasBeenShown=true;this._showChild(_507);}this.inherited(arguments);},_setupChild:function(_508){this.inherited(arguments);dojo.removeClass(_508.domNode,"dijitVisible");dojo.addClass(_508.domNode,"dijitHidden");_508.domNode.title="";},addChild:function(_509,_50a){this.inherited(arguments);if(this._started){dojo.publish(this.id+"-addChild",[_509,_50a]);this.layout();if(!this.selectedChildWidget){this.selectChild(_509);}}},removeChild:function(page){this.inherited(arguments);if(this._started){dojo.publish(this.id+"-removeChild",[page]);}if(this._beingDestroyed){return;}if(this._started){this.layout();}if(this.selectedChildWidget===page){this.selectedChildWidget=undefined;if(this._started){var _50b=this.getChildren();if(_50b.length){this.selectChild(_50b[0]);}}}},selectChild:function(page){page=dijit.byId(page);if(this.selectedChildWidget!=page){this._transition(page,this.selectedChildWidget);this.selectedChildWidget=page;dojo.publish(this.id+"-selectChild",[page]);if(this.persist){dojo.cookie(this.id+"_selectedChild",this.selectedChildWidget.id);}}},_transition:function(_50c,_50d){if(_50d){this._hideChild(_50d);}this._showChild(_50c);if(_50c.resize){if(this.doLayout){_50c.resize(this._containerContentBox||this._contentBox);}else{_50c.resize();}}},_adjacent:function(_50e){var _50f=this.getChildren();var _510=dojo.indexOf(_50f,this.selectedChildWidget);_510+=_50e?1:_50f.length-1;return _50f[_510%_50f.length];},forward:function(){this.selectChild(this._adjacent(true));},back:function(){this.selectChild(this._adjacent(false));},_onKeyPress:function(e){dojo.publish(this.id+"-containerKeyPress",[{e:e,page:this}]);},layout:function(){if(this.doLayout&&this.selectedChildWidget&&this.selectedChildWidget.resize){this.selectedChildWidget.resize(this._contentBox);}},_showChild:function(page){var _511=this.getChildren();page.isFirstChild=(page==_511[0]);page.isLastChild=(page==_511[_511.length-1]);page.selected=true;dojo.removeClass(page.domNode,"dijitHidden");dojo.addClass(page.domNode,"dijitVisible");page._onShow();},_hideChild:function(page){page.selected=false;dojo.removeClass(page.domNode,"dijitVisible");dojo.addClass(page.domNode,"dijitHidden");page.onHide();},closeChild:function(page){var _512=page.onClose(this,page);if(_512){this.removeChild(page);page.destroyRecursive();}},destroyDescendants:function(_513){dojo.forEach(this.getChildren(),function(_514){this.removeChild(_514);_514.destroyRecursive(_513);},this);}});dojo.extend(dijit._Widget,{selected:false,closable:false,iconClass:"",showTitle:true,onClose:function(){return true;}});}if(!dojo._hasResource["dijit.layout.AccordionPane"]){dojo._hasResource["dijit.layout.AccordionPane"]=true;dojo.provide("dijit.layout.AccordionPane");dojo.declare("dijit.layout.AccordionPane",dijit.layout.ContentPane,{constructor:function(){dojo.deprecated("dijit.layout.AccordionPane deprecated, use ContentPane instead","","2.0");},onSelected:function(){}});}if(!dojo._hasResource["dijit.layout.AccordionContainer"]){dojo._hasResource["dijit.layout.AccordionContainer"]=true;dojo.provide("dijit.layout.AccordionContainer");dojo.declare("dijit.layout.AccordionContainer",dijit.layout.StackContainer,{duration:dijit.defaultDuration,buttonWidget:"dijit.layout._AccordionButton",_verticalSpace:0,baseClass:"dijitAccordionContainer",postCreate:function(){this.domNode.style.overflow="hidden";this.inherited(arguments);dijit.setWaiRole(this.domNode,"tablist");},startup:function(){if(this._started){return;}this.inherited(arguments);if(this.selectedChildWidget){var _515=this.selectedChildWidget.containerNode.style;_515.display="";_515.overflow="auto";this.selectedChildWidget._buttonWidget._setSelectedState(true);}},_getTargetHeight:function(node){var cs=dojo.getComputedStyle(node);return Math.max(this._verticalSpace-dojo._getPadBorderExtents(node,cs).h,0);},layout:function(){var _516=this.selectedChildWidget;var _517=0;dojo.forEach(this.getChildren(),function(_518){_517+=_518._buttonWidget.getTitleHeight();});var _519=this._contentBox;this._verticalSpace=_519.h-_517;this._containerContentBox={h:this._verticalSpace,w:_519.w};if(_516){_516.resize(this._containerContentBox);}},_setupChild:function(_51a){var cls=dojo.getObject(this.buttonWidget);var _51b=(_51a._buttonWidget=new cls({contentWidget:_51a,label:_51a.title,title:_51a.tooltip,iconClass:_51a.iconClass,id:_51a.id+"_button",parent:this}));_51a._accordionConnectHandle=this.connect(_51a,"attr",function(name,_51c){if(arguments.length==2){switch(name){case "title":case "iconClass":_51b.attr(name,_51c);}}});dojo.place(_51a._buttonWidget.domNode,_51a.domNode,"before");this.inherited(arguments);},removeChild:function(_51d){this.disconnect(_51d._accordionConnectHandle);delete _51d._accordionConnectHandle;_51d._buttonWidget.destroy();delete _51d._buttonWidget;this.inherited(arguments);},getChildren:function(){return dojo.filter(this.inherited(arguments),function(_51e){return _51e.declaredClass!=this.buttonWidget;},this);},destroy:function(){dojo.forEach(this.getChildren(),function(_51f){_51f._buttonWidget.destroy();});this.inherited(arguments);},_transition:function(_520,_521){if(this._inTransition){return;}this._inTransition=true;var _522=[];var _523=this._verticalSpace;if(_520){_520._buttonWidget.setSelected(true);this._showChild(_520);if(this.doLayout&&_520.resize){_520.resize(this._containerContentBox);}var _524=_520.domNode;dojo.addClass(_524,"dijitVisible");dojo.removeClass(_524,"dijitHidden");var _525=_524.style.overflow;_524.style.overflow="hidden";_522.push(dojo.animateProperty({node:_524,duration:this.duration,properties:{height:{start:1,end:this._getTargetHeight(_524)}},onEnd:dojo.hitch(this,function(){_524.style.overflow=_525;delete this._inTransition;})}));}if(_521){_521._buttonWidget.setSelected(false);var _526=_521.domNode,_527=_526.style.overflow;_526.style.overflow="hidden";_522.push(dojo.animateProperty({node:_526,duration:this.duration,properties:{height:{start:this._getTargetHeight(_526),end:1}},onEnd:function(){dojo.addClass(_526,"dijitHidden");dojo.removeClass(_526,"dijitVisible");_526.style.overflow=_527;if(_521.onHide){_521.onHide();}}}));}dojo.fx.combine(_522).play();},_onKeyPress:function(e,_528){if(this._inTransition||this.disabled||e.altKey||!(_528||e.ctrlKey)){if(this._inTransition){dojo.stopEvent(e);}return;}var k=dojo.keys,c=e.charOrCode;if((_528&&(c==k.LEFT_ARROW||c==k.UP_ARROW))||(e.ctrlKey&&c==k.PAGE_UP)){this._adjacent(false)._buttonWidget._onTitleClick();dojo.stopEvent(e);}else{if((_528&&(c==k.RIGHT_ARROW||c==k.DOWN_ARROW))||(e.ctrlKey&&(c==k.PAGE_DOWN||c==k.TAB))){this._adjacent(true)._buttonWidget._onTitleClick();dojo.stopEvent(e);}}}});dojo.declare("dijit.layout._AccordionButton",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dijit.layout","templates/AccordionButton.html","<div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus,onmouseenter:_onTitleEnter,onmouseleave:_onTitleLeave'\n\t\tclass='dijitAccordionTitle' wairole=\"tab\" waiState=\"expanded-false\"\n\t\t><span class='dijitInline dijitAccordionArrow' waiRole=\"presentation\"></span\n\t\t><span class='arrowTextUp' waiRole=\"presentation\">+</span\n\t\t><span class='arrowTextDown' waiRole=\"presentation\">-</span\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint='iconNode' style=\"vertical-align: middle\" waiRole=\"presentation\"/>\n\t\t<span waiRole=\"presentation\" dojoAttachPoint='titleTextNode' class='dijitAccordionText'></span>\n</div>\n"),attributeMap:dojo.mixin(dojo.clone(dijit.layout.ContentPane.prototype.attributeMap),{label:{node:"titleTextNode",type:"innerHTML"},title:{node:"titleTextNode",type:"attribute",attribute:"title"},iconClass:{node:"iconNode",type:"class"}}),baseClass:"dijitAccordionTitle",getParent:function(){return this.parent;},postCreate:function(){this.inherited(arguments);dojo.setSelectable(this.domNode,false);this.setSelected(this.selected);var _529=dojo.attr(this.domNode,"id").replace(" ","_");dojo.attr(this.titleTextNode,"id",_529+"_title");dijit.setWaiState(this.focusNode,"labelledby",dojo.attr(this.titleTextNode,"id"));},getTitleHeight:function(){return dojo.marginBox(this.titleNode).h;},_onTitleClick:function(){var _52a=this.getParent();if(!_52a._inTransition){_52a.selectChild(this.contentWidget);dijit.focus(this.focusNode);}},_onTitleEnter:function(){dojo.addClass(this.focusNode,"dijitAccordionTitle-hover");},_onTitleLeave:function(){dojo.removeClass(this.focusNode,"dijitAccordionTitle-hover");},_onTitleKeyPress:function(evt){return this.getParent()._onKeyPress(evt,this.contentWidget);},_setSelectedState:function(_52b){this.selected=_52b;dojo[(_52b?"addClass":"removeClass")](this.titleNode,"dijitAccordionTitle-selected");dijit.setWaiState(this.focusNode,"expanded",_52b);dijit.setWaiState(this.focusNode,"selected",_52b);this.focusNode.setAttribute("tabIndex",_52b?"0":"-1");},_handleFocus:function(e){dojo.toggleClass(this.titleTextNode,"dijitAccordionFocused",e.type=="focus");},setSelected:function(_52c){this._setSelectedState(_52c);if(_52c){var cw=this.contentWidget;if(cw.onSelected){cw.onSelected();}}}});}if(!dojo._hasResource["dijit.layout.BorderContainer"]){dojo._hasResource["dijit.layout.BorderContainer"]=true;dojo.provide("dijit.layout.BorderContainer");dojo.declare("dijit.layout.BorderContainer",dijit.layout._LayoutWidget,{design:"headline",gutters:true,liveSplitters:true,persist:false,baseClass:"dijitBorderContainer",_splitterClass:"dijit.layout._Splitter",postMixInProperties:function(){if(!this.gutters){this.baseClass+="NoGutter";}this.inherited(arguments);},postCreate:function(){this.inherited(arguments);this._splitters={};this._splitterThickness={};},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),this._setupChild,this);this.inherited(arguments);},_setupChild:function(_52d){var _52e=_52d.region;if(_52e){this.inherited(arguments);dojo.addClass(_52d.domNode,this.baseClass+"Pane");var ltr=this.isLeftToRight();if(_52e=="leading"){_52e=ltr?"left":"right";}if(_52e=="trailing"){_52e=ltr?"right":"left";}this["_"+_52e]=_52d.domNode;this["_"+_52e+"Widget"]=_52d;if((_52d.splitter||this.gutters)&&!this._splitters[_52e]){var _52f=dojo.getObject(_52d.splitter?this._splitterClass:"dijit.layout._Gutter");var _530=new _52f({container:this,child:_52d,region:_52e,live:this.liveSplitters});_530.isSplitter=true;this._splitters[_52e]=_530.domNode;dojo.place(this._splitters[_52e],_52d.domNode,"after");_530.startup();}_52d.region=_52e;}},_computeSplitterThickness:function(_531){this._splitterThickness[_531]=this._splitterThickness[_531]||dojo.marginBox(this._splitters[_531])[(/top|bottom/.test(_531)?"h":"w")];},layout:function(){for(var _532 in this._splitters){this._computeSplitterThickness(_532);}this._layoutChildren();},addChild:function(_533,_534){this.inherited(arguments);if(this._started){this.layout();}},removeChild:function(_535){var _536=_535.region;var _537=this._splitters[_536];if(_537){dijit.byNode(_537).destroy();delete this._splitters[_536];delete this._splitterThickness[_536];}this.inherited(arguments);delete this["_"+_536];delete this["_"+_536+"Widget"];if(this._started){this._layoutChildren(_535.region);}dojo.removeClass(_535.domNode,this.baseClass+"Pane");},getChildren:function(){return dojo.filter(this.inherited(arguments),function(_538){return !_538.isSplitter;});},getSplitter:function(_539){var _53a=this._splitters[_539];return _53a?dijit.byNode(_53a):null;},resize:function(_53b,_53c){if(!this.cs||!this.pe){var node=this.domNode;this.cs=dojo.getComputedStyle(node);this.pe=dojo._getPadExtents(node,this.cs);this.pe.r=dojo._toPixelValue(node,this.cs.paddingRight);this.pe.b=dojo._toPixelValue(node,this.cs.paddingBottom);dojo.style(node,"padding","0px");}this.inherited(arguments);},_layoutChildren:function(_53d){if(!this._borderBox||!this._borderBox.h){return;}var _53e=(this.design=="sidebar");var _53f=0,_540=0,_541=0,_542=0;var _543={},_544={},_545={},_546={},_547=(this._center&&this._center.style)||{};var _548=/left|right/.test(_53d);var _549=!_53d||(!_548&&!_53e);var _54a=!_53d||(_548&&_53e);if(this._top){_543=_54a&&this._top.style;_53f=dojo.marginBox(this._top).h;}if(this._left){_544=_549&&this._left.style;_541=dojo.marginBox(this._left).w;}if(this._right){_545=_549&&this._right.style;_542=dojo.marginBox(this._right).w;}if(this._bottom){_546=_54a&&this._bottom.style;_540=dojo.marginBox(this._bottom).h;}var _54b=this._splitters;var _54c=_54b.top,_54d=_54b.bottom,_54e=_54b.left,_54f=_54b.right;var _550=this._splitterThickness;var _551=_550.top||0,_552=_550.left||0,_553=_550.right||0,_554=_550.bottom||0;if(_552>50||_553>50){setTimeout(dojo.hitch(this,function(){this._splitterThickness={};for(var _555 in this._splitters){this._computeSplitterThickness(_555);}this._layoutChildren();}),50);return false;}var pe=this.pe;var _556={left:(_53e?_541+_552:0)+pe.l+"px",right:(_53e?_542+_553:0)+pe.r+"px"};if(_54c){dojo.mixin(_54c.style,_556);_54c.style.top=_53f+pe.t+"px";}if(_54d){dojo.mixin(_54d.style,_556);_54d.style.bottom=_540+pe.b+"px";}_556={top:(_53e?0:_53f+_551)+pe.t+"px",bottom:(_53e?0:_540+_554)+pe.b+"px"};if(_54e){dojo.mixin(_54e.style,_556);_54e.style.left=_541+pe.l+"px";}if(_54f){dojo.mixin(_54f.style,_556);_54f.style.right=_542+pe.r+"px";}dojo.mixin(_547,{top:pe.t+_53f+_551+"px",left:pe.l+_541+_552+"px",right:pe.r+_542+_553+"px",bottom:pe.b+_540+_554+"px"});var _557={top:_53e?pe.t+"px":_547.top,bottom:_53e?pe.b+"px":_547.bottom};dojo.mixin(_544,_557);dojo.mixin(_545,_557);_544.left=pe.l+"px";_545.right=pe.r+"px";_543.top=pe.t+"px";_546.bottom=pe.b+"px";if(_53e){_543.left=_546.left=_541+_552+pe.l+"px";_543.right=_546.right=_542+_553+pe.r+"px";}else{_543.left=_546.left=pe.l+"px";_543.right=_546.right=pe.r+"px";}var _558=this._borderBox.h-pe.t-pe.b,_559=_558-(_53f+_551+_540+_554),_55a=_53e?_558:_559;var _55b=this._borderBox.w-pe.l-pe.r,_55c=_55b-(_541+_552+_542+_553),_55d=_53e?_55c:_55b;var dim={top:{w:_55d,h:_53f},bottom:{w:_55d,h:_540},left:{w:_541,h:_55a},right:{w:_542,h:_55a},center:{h:_559,w:_55c}};var _55e=dojo.isIE<8||(dojo.isIE&&dojo.isQuirks)||dojo.some(this.getChildren(),function(_55f){return _55f.domNode.tagName=="TEXTAREA"||_55f.domNode.tagName=="INPUT";});if(_55e){var _560=function(_561,_562,_563){if(_561){(_561.resize?_561.resize(_562,_563):dojo.marginBox(_561.domNode,_562));}};if(_54e){_54e.style.height=_55a;}if(_54f){_54f.style.height=_55a;}_560(this._leftWidget,{h:_55a},dim.left);_560(this._rightWidget,{h:_55a},dim.right);if(_54c){_54c.style.width=_55d;}if(_54d){_54d.style.width=_55d;}_560(this._topWidget,{w:_55d},dim.top);_560(this._bottomWidget,{w:_55d},dim.bottom);_560(this._centerWidget,dim.center);}else{var _564={};if(_53d){_564[_53d]=_564.center=true;if(/top|bottom/.test(_53d)&&this.design!="sidebar"){_564.left=_564.right=true;}else{if(/left|right/.test(_53d)&&this.design=="sidebar"){_564.top=_564.bottom=true;}}}dojo.forEach(this.getChildren(),function(_565){if(_565.resize&&(!_53d||_565.region in _564)){_565.resize(null,dim[_565.region]);}},this);}},destroy:function(){for(var _566 in this._splitters){var _567=this._splitters[_566];dijit.byNode(_567).destroy();dojo.destroy(_567);}delete this._splitters;delete this._splitterThickness;this.inherited(arguments);}});dojo.extend(dijit._Widget,{region:"",splitter:false,minSize:0,maxSize:Infinity});dojo.declare("dijit.layout._Splitter",[dijit._Widget,dijit._Templated],{live:true,templateString:"<div class=\"dijitSplitter\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse\" tabIndex=\"0\" waiRole=\"separator\"><div class=\"dijitSplitterThumb\"></div></div>",postCreate:function(){this.inherited(arguments);this.horizontal=/top|bottom/.test(this.region);dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V"));this._factor=/top|left/.test(this.region)?1:-1;this._cookieName=this.container.id+"_"+this.region;if(this.container.persist){var _568=dojo.cookie(this._cookieName);if(_568){this.child.domNode.style[this.horizontal?"height":"width"]=_568;}}},_computeMaxSize:function(){var dim=this.horizontal?"h":"w",_569=this.container._splitterThickness[this.region];var flip={left:"right",right:"left",top:"bottom",bottom:"top",leading:"trailing",trailing:"leading"},_56a=this.container["_"+flip[this.region]];var _56b=dojo.contentBox(this.container.domNode)[dim]-(_56a?dojo.marginBox(_56a)[dim]:0)-20-_569*2;return Math.min(this.child.maxSize,_56b);},_startDrag:function(e){if(!this.cover){this.cover=dojo.doc.createElement("div");dojo.addClass(this.cover,"dijitSplitterCover");dojo.place(this.cover,this.child.domNode,"after");}dojo.addClass(this.cover,"dijitSplitterCoverActive");if(this.fake){dojo.destroy(this.fake);}if(!(this._resize=this.live)){(this.fake=this.domNode.cloneNode(true)).removeAttribute("id");dojo.addClass(this.domNode,"dijitSplitterShadow");dojo.place(this.fake,this.domNode,"after");}dojo.addClass(this.domNode,"dijitSplitterActive");dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Active");if(this.fake){dojo.removeClass(this.fake,"dijitSplitterHover");dojo.removeClass(this.fake,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover");}var _56c=this._factor,max=this._computeMaxSize(),min=this.child.minSize||20,_56d=this.horizontal,axis=_56d?"pageY":"pageX",_56e=e[axis],_56f=this.domNode.style,dim=_56d?"h":"w",_570=dojo.marginBox(this.child.domNode)[dim],_571=this.region,_572=parseInt(this.domNode.style[_571],10),_573=this._resize,mb={},_574=this.child.domNode,_575=dojo.hitch(this.container,this.container._layoutChildren),de=dojo.doc.body;this._handlers=(this._handlers||[]).concat([dojo.connect(de,"onmousemove",this._drag=function(e,_576){var _577=e[axis]-_56e,_578=_56c*_577+_570,_579=Math.max(Math.min(_578,max),min);if(_573||_576){mb[dim]=_579;dojo.marginBox(_574,mb);_575(_571);}_56f[_571]=_56c*_577+_572+(_579-_578)+"px";}),dojo.connect(dojo.doc,"ondragstart",dojo.stopEvent),dojo.connect(dojo.body(),"onselectstart",dojo.stopEvent),dojo.connect(de,"onmouseup",this,"_stopDrag")]);dojo.stopEvent(e);},_onMouse:function(e){var o=(e.type=="mouseover"||e.type=="mouseenter");dojo.toggleClass(this.domNode,"dijitSplitterHover",o);dojo.toggleClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover",o);},_stopDrag:function(e){try{if(this.cover){dojo.removeClass(this.cover,"dijitSplitterCoverActive");}if(this.fake){dojo.destroy(this.fake);}dojo.removeClass(this.domNode,"dijitSplitterActive");dojo.removeClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Active");dojo.removeClass(this.domNode,"dijitSplitterShadow");this._drag(e);this._drag(e,true);}finally{this._cleanupHandlers();delete this._drag;}if(this.container.persist){dojo.cookie(this._cookieName,this.child.domNode.style[this.horizontal?"height":"width"],{expires:365});}},_cleanupHandlers:function(){dojo.forEach(this._handlers,dojo.disconnect);delete this._handlers;},_onKeyPress:function(e){this._resize=true;var _57a=this.horizontal;var tick=1;var dk=dojo.keys;switch(e.charOrCode){case _57a?dk.UP_ARROW:dk.LEFT_ARROW:tick*=-1;case _57a?dk.DOWN_ARROW:dk.RIGHT_ARROW:break;default:return;}var _57b=dojo.marginBox(this.child.domNode)[_57a?"h":"w"]+this._factor*tick;var mb={};mb[this.horizontal?"h":"w"]=Math.max(Math.min(_57b,this._computeMaxSize()),this.child.minSize);dojo.marginBox(this.child.domNode,mb);this.container._layoutChildren(this.region);dojo.stopEvent(e);},destroy:function(){this._cleanupHandlers();delete this.child;delete this.container;delete this.cover;delete this.fake;this.inherited(arguments);}});dojo.declare("dijit.layout._Gutter",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dijitGutter\" waiRole=\"presentation\"></div>",postCreate:function(){this.horizontal=/top|bottom/.test(this.region);dojo.addClass(this.domNode,"dijitGutter"+(this.horizontal?"H":"V"));}});}if(!dojo._hasResource["dijit.layout.LayoutContainer"]){dojo._hasResource["dijit.layout.LayoutContainer"]=true;dojo.provide("dijit.layout.LayoutContainer");dojo.declare("dijit.layout.LayoutContainer",dijit.layout._LayoutWidget,{baseClass:"dijitLayoutContainer",constructor:function(){dojo.deprecated("dijit.layout.LayoutContainer is deprecated","use BorderContainer instead",2);},layout:function(){dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());},addChild:function(_57c,_57d){this.inherited(arguments);if(this._started){dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());}},removeChild:function(_57e){this.inherited(arguments);if(this._started){dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());}}});dojo.extend(dijit._Widget,{layoutAlign:"none"});}if(!dojo._hasResource["dijit.layout.LinkPane"]){dojo._hasResource["dijit.layout.LinkPane"]=true;dojo.provide("dijit.layout.LinkPane");dojo.declare("dijit.layout.LinkPane",[dijit.layout.ContentPane,dijit._Templated],{templateString:"<div class=\"dijitLinkPane\" dojoAttachPoint=\"containerNode\"></div>",postMixInProperties:function(){if(this.srcNodeRef){this.title+=this.srcNodeRef.innerHTML;}this.inherited(arguments);},_fillContent:function(_57f){}});}if(!dojo._hasResource["dijit.layout.SplitContainer"]){dojo._hasResource["dijit.layout.SplitContainer"]=true;dojo.provide("dijit.layout.SplitContainer");dojo.declare("dijit.layout.SplitContainer",dijit.layout._LayoutWidget,{constructor:function(){dojo.deprecated("dijit.layout.SplitContainer is deprecated","use BorderContainer with splitter instead",2);},activeSizing:false,sizerWidth:7,orientation:"horizontal",persist:true,baseClass:"dijitSplitContainer",postMixInProperties:function(){this.inherited("postMixInProperties",arguments);this.isHorizontal=(this.orientation=="horizontal");},postCreate:function(){this.inherited(arguments);this.sizers=[];if(dojo.isMozilla){this.domNode.style.overflow="-moz-scrollbars-none";}if(typeof this.sizerWidth=="object"){try{this.sizerWidth=parseInt(this.sizerWidth.toString());}catch(e){this.sizerWidth=7;}}var _580=dojo.doc.createElement("div");this.virtualSizer=_580;_580.style.position="relative";_580.style.zIndex=10;_580.className=this.isHorizontal?"dijitSplitContainerVirtualSizerH":"dijitSplitContainerVirtualSizerV";this.domNode.appendChild(_580);dojo.setSelectable(_580,false);},destroy:function(){delete this.virtualSizer;dojo.forEach(this._ownconnects,dojo.disconnect);this.inherited(arguments);},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_581,i,_582){this._setupChild(_581);if(i<_582.length-1){this._addSizer();}},this);if(this.persist){this._restoreState();}this.inherited(arguments);},_setupChild:function(_583){this.inherited(arguments);_583.domNode.style.position="absolute";dojo.addClass(_583.domNode,"dijitSplitPane");},_onSizerMouseDown:function(e){if(e.target.id){for(var i=0;i<this.sizers.length;i++){if(this.sizers[i].id==e.target.id){break;}}if(i<this.sizers.length){this.beginSizing(e,i);}}},_addSizer:function(_584){_584=_584===undefined?this.sizers.length:_584;var _585=dojo.doc.createElement("div");_585.id=dijit.getUniqueId("dijit_layout_SplitterContainer_Splitter");this.sizers.splice(_584,0,_585);this.domNode.appendChild(_585);_585.className=this.isHorizontal?"dijitSplitContainerSizerH":"dijitSplitContainerSizerV";var _586=dojo.doc.createElement("div");_586.className="thumb";_586.id=_585.id;_585.appendChild(_586);this.connect(_585,"onmousedown","_onSizerMouseDown");dojo.setSelectable(_585,false);},removeChild:function(_587){if(this.sizers.length){var i=dojo.indexOf(this.getChildren(),_587);if(i!=-1){if(i==this.sizers.length){i--;}dojo.destroy(this.sizers[i]);this.sizers.splice(i,1);}}this.inherited(arguments);if(this._started){this.layout();}},addChild:function(_588,_589){this.inherited(arguments);if(this._started){var _58a=this.getChildren();if(_58a.length>1){this._addSizer(_589);}this.layout();}},layout:function(){this.paneWidth=this._contentBox.w;this.paneHeight=this._contentBox.h;var _58b=this.getChildren();if(!_58b.length){return;}var _58c=this.isHorizontal?this.paneWidth:this.paneHeight;if(_58b.length>1){_58c-=this.sizerWidth*(_58b.length-1);}var _58d=0;dojo.forEach(_58b,function(_58e){_58d+=_58e.sizeShare;});var _58f=_58c/_58d;var _590=0;dojo.forEach(_58b.slice(0,_58b.length-1),function(_591){var size=Math.round(_58f*_591.sizeShare);_591.sizeActual=size;_590+=size;});_58b[_58b.length-1].sizeActual=_58c-_590;this._checkSizes();var pos=0;var size=_58b[0].sizeActual;this._movePanel(_58b[0],pos,size);_58b[0].position=pos;pos+=size;if(!this.sizers){return;}dojo.some(_58b.slice(1),function(_592,i){if(!this.sizers[i]){return true;}this._moveSlider(this.sizers[i],pos,this.sizerWidth);this.sizers[i].position=pos;pos+=this.sizerWidth;size=_592.sizeActual;this._movePanel(_592,pos,size);_592.position=pos;pos+=size;},this);},_movePanel:function(_593,pos,size){if(this.isHorizontal){_593.domNode.style.left=pos+"px";_593.domNode.style.top=0;var box={w:size,h:this.paneHeight};if(_593.resize){_593.resize(box);}else{dojo.marginBox(_593.domNode,box);}}else{_593.domNode.style.left=0;_593.domNode.style.top=pos+"px";var box={w:this.paneWidth,h:size};if(_593.resize){_593.resize(box);}else{dojo.marginBox(_593.domNode,box);}}},_moveSlider:function(_594,pos,size){if(this.isHorizontal){_594.style.left=pos+"px";_594.style.top=0;dojo.marginBox(_594,{w:size,h:this.paneHeight});}else{_594.style.left=0;_594.style.top=pos+"px";dojo.marginBox(_594,{w:this.paneWidth,h:size});}},_growPane:function(_595,pane){if(_595>0){if(pane.sizeActual>pane.sizeMin){if((pane.sizeActual-pane.sizeMin)>_595){pane.sizeActual=pane.sizeActual-_595;_595=0;}else{_595-=pane.sizeActual-pane.sizeMin;pane.sizeActual=pane.sizeMin;}}}return _595;},_checkSizes:function(){var _596=0;var _597=0;var _598=this.getChildren();dojo.forEach(_598,function(_599){_597+=_599.sizeActual;_596+=_599.sizeMin;});if(_596<=_597){var _59a=0;dojo.forEach(_598,function(_59b){if(_59b.sizeActual<_59b.sizeMin){_59a+=_59b.sizeMin-_59b.sizeActual;_59b.sizeActual=_59b.sizeMin;}});if(_59a>0){var list=this.isDraggingLeft?_598.reverse():_598;dojo.forEach(list,function(_59c){_59a=this._growPane(_59a,_59c);},this);}}else{dojo.forEach(_598,function(_59d){_59d.sizeActual=Math.round(_597*(_59d.sizeMin/_596));});}},beginSizing:function(e,i){var _59e=this.getChildren();this.paneBefore=_59e[i];this.paneAfter=_59e[i+1];this.isSizing=true;this.sizingSplitter=this.sizers[i];if(!this.cover){this.cover=dojo.create("div",{style:{position:"absolute",zIndex:5,top:0,left:0,width:"100%",height:"100%"}},this.domNode);}else{this.cover.style.zIndex=5;}this.sizingSplitter.style.zIndex=6;this.originPos=dojo.position(_59e[0].domNode,true);if(this.isHorizontal){var _59f=e.layerX||e.offsetX||0;var _5a0=e.pageX;this.originPos=this.originPos.x;}else{var _59f=e.layerY||e.offsetY||0;var _5a0=e.pageY;this.originPos=this.originPos.y;}this.startPoint=this.lastPoint=_5a0;this.screenToClientOffset=_5a0-_59f;this.dragOffset=this.lastPoint-this.paneBefore.sizeActual-this.originPos-this.paneBefore.position;if(!this.activeSizing){this._showSizingLine();}this._ownconnects=[];this._ownconnects.push(dojo.connect(dojo.doc.documentElement,"onmousemove",this,"changeSizing"));this._ownconnects.push(dojo.connect(dojo.doc.documentElement,"onmouseup",this,"endSizing"));dojo.stopEvent(e);},changeSizing:function(e){if(!this.isSizing){return;}this.lastPoint=this.isHorizontal?e.pageX:e.pageY;this.movePoint();if(this.activeSizing){this._updateSize();}else{this._moveSizingLine();}dojo.stopEvent(e);},endSizing:function(e){if(!this.isSizing){return;}if(this.cover){this.cover.style.zIndex=-1;}if(!this.activeSizing){this._hideSizingLine();}this._updateSize();this.isSizing=false;if(this.persist){this._saveState(this);}dojo.forEach(this._ownconnects,dojo.disconnect);},movePoint:function(){var p=this.lastPoint-this.screenToClientOffset;var a=p-this.dragOffset;a=this.legaliseSplitPoint(a);p=a+this.dragOffset;this.lastPoint=p+this.screenToClientOffset;},legaliseSplitPoint:function(a){a+=this.sizingSplitter.position;this.isDraggingLeft=!!(a>0);if(!this.activeSizing){var min=this.paneBefore.position+this.paneBefore.sizeMin;if(a<min){a=min;}var max=this.paneAfter.position+(this.paneAfter.sizeActual-(this.sizerWidth+this.paneAfter.sizeMin));if(a>max){a=max;}}a-=this.sizingSplitter.position;this._checkSizes();return a;},_updateSize:function(){var pos=this.lastPoint-this.dragOffset-this.originPos;var _5a1=this.paneBefore.position;var _5a2=this.paneAfter.position+this.paneAfter.sizeActual;this.paneBefore.sizeActual=pos-_5a1;this.paneAfter.position=pos+this.sizerWidth;this.paneAfter.sizeActual=_5a2-this.paneAfter.position;dojo.forEach(this.getChildren(),function(_5a3){_5a3.sizeShare=_5a3.sizeActual;});if(this._started){this.layout();}},_showSizingLine:function(){this._moveSizingLine();dojo.marginBox(this.virtualSizer,this.isHorizontal?{w:this.sizerWidth,h:this.paneHeight}:{w:this.paneWidth,h:this.sizerWidth});this.virtualSizer.style.display="block";},_hideSizingLine:function(){this.virtualSizer.style.display="none";},_moveSizingLine:function(){var pos=(this.lastPoint-this.startPoint)+this.sizingSplitter.position;dojo.style(this.virtualSizer,(this.isHorizontal?"left":"top"),pos+"px");},_getCookieName:function(i){return this.id+"_"+i;},_restoreState:function(){dojo.forEach(this.getChildren(),function(_5a4,i){var _5a5=this._getCookieName(i);var _5a6=dojo.cookie(_5a5);if(_5a6){var pos=parseInt(_5a6);if(typeof pos=="number"){_5a4.sizeShare=pos;}}},this);},_saveState:function(){if(!this.persist){return;}dojo.forEach(this.getChildren(),function(_5a7,i){dojo.cookie(this._getCookieName(i),_5a7.sizeShare,{expires:365});},this);}});dojo.extend(dijit._Widget,{sizeMin:10,sizeShare:10});}if(!dojo._hasResource["dijit.layout._TabContainerBase"]){dojo._hasResource["dijit.layout._TabContainerBase"]=true;dojo.provide("dijit.layout._TabContainerBase");dojo.declare("dijit.layout._TabContainerBase",[dijit.layout.StackContainer,dijit._Templated],{tabPosition:"top",baseClass:"dijitTabContainer",tabStrip:false,nested:false,templateString:dojo.cache("dijit.layout","templates/TabContainer.html","<div class=\"dijitTabContainer\">\n\t<div class=\"dijitTabListWrapper\" dojoAttachPoint=\"tablistNode\"></div>\n\t<div dojoAttachPoint=\"tablistSpacer\" class=\"dijitTabSpacer ${baseClass}-spacer\"></div>\n\t<div class=\"dijitTabPaneWrapper ${baseClass}-container\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n"),postMixInProperties:function(){this.baseClass+=this.tabPosition.charAt(0).toUpperCase()+this.tabPosition.substr(1).replace(/-.*/,"");this.srcNodeRef&&dojo.style(this.srcNodeRef,"visibility","hidden");this.inherited(arguments);},postCreate:function(){this.inherited(arguments);this.tablist=this._makeController(this.tablistNode);if(!this.doLayout){dojo.addClass(this.domNode,"dijitTabContainerNoLayout");}if(this.nested){dojo.addClass(this.domNode,"dijitTabContainerNested");dojo.addClass(this.tablist.containerNode,"dijitTabContainerTabListNested");dojo.addClass(this.tablistSpacer,"dijitTabContainerSpacerNested");dojo.addClass(this.containerNode,"dijitTabPaneWrapperNested");}else{dojo.addClass(this.domNode,"tabStrip-"+(this.tabStrip?"enabled":"disabled"));}},_setupChild:function(tab){dojo.addClass(tab.domNode,"dijitTabPane");this.inherited(arguments);},startup:function(){if(this._started){return;}this.tablist.startup();this.inherited(arguments);},layout:function(){if(!this._contentBox||typeof (this._contentBox.l)=="undefined"){return;}var sc=this.selectedChildWidget;if(this.doLayout){var _5a8=this.tabPosition.replace(/-h/,"");this.tablist.layoutAlign=_5a8;var _5a9=[this.tablist,{domNode:this.tablistSpacer,layoutAlign:_5a8},{domNode:this.containerNode,layoutAlign:"client"}];dijit.layout.layoutChildren(this.domNode,this._contentBox,_5a9);this._containerContentBox=dijit.layout.marginBox2contentBox(this.containerNode,_5a9[2]);if(sc&&sc.resize){sc.resize(this._containerContentBox);}}else{if(this.tablist.resize){this.tablist.resize({w:dojo.contentBox(this.domNode).w});}if(sc&&sc.resize){sc.resize();}}},destroy:function(){if(this.tablist){this.tablist.destroy();}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.layout.TabController"]){dojo._hasResource["dijit.layout.TabController"]=true;dojo.provide("dijit.layout.TabController");dojo.declare("dijit.layout.TabController",dijit.layout.StackController,{templateString:"<div wairole='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",tabPosition:"top",buttonWidget:"dijit.layout._TabButton",_rectifyRtlTabList:function(){if(0>=this.tabPosition.indexOf("-h")){return;}if(!this.pane2button){return;}var _5aa=0;for(var pane in this.pane2button){var ow=this.pane2button[pane].innerDiv.scrollWidth;_5aa=Math.max(_5aa,ow);}for(pane in this.pane2button){this.pane2button[pane].innerDiv.style.width=_5aa+"px";}}});dojo.declare("dijit.layout._TabButton",dijit.layout._StackButton,{baseClass:"dijitTab",templateString:dojo.cache("dijit.layout","templates/_TabButton.html","<div waiRole=\"presentation\" dojoAttachPoint=\"titleNode\" dojoAttachEvent='onclick:onClick,onmouseenter:_onMouse,onmouseleave:_onMouse'>\n    <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n        <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent,focusNode'>\n\t        <img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint='iconNode' waiRole=\"presentation\"/>\n\t        <span dojoAttachPoint='containerNode' class='tabLabel'></span>\n\t        <span class=\"closeButton\" dojoAttachPoint='closeNode'\n\t        \t\tdojoAttachEvent='onclick: onClickCloseButton, onmouseenter: _onCloseButtonEnter, onmouseleave: _onCloseButtonLeave'>\n\t        \t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint='closeIcon' class='closeImage' waiRole=\"presentation\"/>\n\t            <span dojoAttachPoint='closeText' class='closeText'>x</span>\n\t        </span>\n        </div>\n    </div>\n</div>\n"),scrollOnFocus:false,postMixInProperties:function(){if(!this.iconClass){this.iconClass="dijitTabButtonIcon";}},postCreate:function(){this.inherited(arguments);dojo.setSelectable(this.containerNode,false);if(this.iconNode.className=="dijitTabButtonIcon"){dojo.style(this.iconNode,"width","1px");}},startup:function(){this.inherited(arguments);var n=this.domNode;setTimeout(function(){n.className=n.className;},1);},_setCloseButtonAttr:function(disp){this.closeButton=disp;dojo.toggleClass(this.innerDiv,"dijitClosable",disp);this.closeNode.style.display=disp?"":"none";if(disp){var _5ab=dojo.i18n.getLocalization("dijit","common");if(this.closeNode){dojo.attr(this.closeNode,"title",_5ab.itemClose);if(dojo.isIE<8){dojo.attr(this.closeIcon,"title",_5ab.itemClose);}}var _5ab=dojo.i18n.getLocalization("dijit","common");this._closeMenu=new dijit.Menu({id:this.id+"_Menu",targetNodeIds:[this.domNode]});this._closeMenu.addChild(new dijit.MenuItem({label:_5ab.itemClose,onClick:dojo.hitch(this,"onClickCloseButton")}));}else{if(this._closeMenu){this._closeMenu.destroyRecursive();delete this._closeMenu;}}},destroy:function(){if(this._closeMenu){this._closeMenu.destroyRecursive();delete this._closeMenu;}this.inherited(arguments);},_onCloseButtonEnter:function(){dojo.addClass(this.closeNode,"closeButton-hover");},_onCloseButtonLeave:function(){dojo.removeClass(this.closeNode,"closeButton-hover");}});}if(!dojo._hasResource["dijit.layout.ScrollingTabController"]){dojo._hasResource["dijit.layout.ScrollingTabController"]=true;dojo.provide("dijit.layout.ScrollingTabController");dojo.declare("dijit.layout.ScrollingTabController",dijit.layout.TabController,{templateString:dojo.cache("dijit.layout","templates/ScrollingTabController.html","<div class=\"dijitTabListContainer-${tabPosition}\" style=\"visibility:hidden\">\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\" buttonType=\"menuBtn\" buttonClass=\"tabStripMenuButton\"\n\t\t\ttabPosition=\"${tabPosition}\" dojoAttachPoint=\"_menuBtn\" showLabel=false>&darr;</div>\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\" buttonType=\"leftBtn\" buttonClass=\"tabStripSlideButtonLeft\"\n\t\t\ttabPosition=\"${tabPosition}\" dojoAttachPoint=\"_leftBtn\" dojoAttachEvent=\"onClick: doSlideLeft\" showLabel=false>&larr;</div>\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\" buttonType=\"rightBtn\" buttonClass=\"tabStripSlideButtonRight\"\n\t\t\ttabPosition=\"${tabPosition}\" dojoAttachPoint=\"_rightBtn\" dojoAttachEvent=\"onClick: doSlideRight\" showLabel=false>&rarr;</div>\n\t<div class='dijitTabListWrapper' dojoAttachPoint='tablistWrapper'>\n\t\t<div wairole='tablist' dojoAttachEvent='onkeypress:onkeypress'\n\t\t\t\tdojoAttachPoint='containerNode' class='nowrapTabStrip'>\n\t\t</div>\n\t</div>\n</div>\n"),useMenu:true,useSlider:true,tabStripClass:"",widgetsInTemplate:true,_minScroll:5,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{"class":"containerNode"}),postCreate:function(){this.inherited(arguments);var n=this.domNode;this.scrollNode=this.tablistWrapper;this._initButtons();if(!this.tabStripClass){this.tabStripClass="dijitTabContainer"+this.tabPosition.charAt(0).toUpperCase()+this.tabPosition.substr(1).replace(/-.*/,"")+"None";dojo.addClass(n,"tabStrip-disabled");}dojo.addClass(this.tablistWrapper,this.tabStripClass);},onStartup:function(){this.inherited(arguments);dojo.style(this.domNode,"visibility","visible");this._postStartup=true;},onAddChild:function(page,_5ac){this.inherited(arguments);var _5ad;if(this.useMenu){var _5ae=this.containerId;_5ad=new dijit.MenuItem({label:page.title,onClick:dojo.hitch(this,function(){var _5af=dijit.byId(_5ae);_5af.selectChild(page);})});this._menuChildren[page.id]=_5ad;this._menu.addChild(_5ad,_5ac);}this.pane2handles[page.id].push(this.connect(this.pane2button[page.id],"attr",function(name,_5b0){if(this._postStartup){if(arguments.length==2&&name=="label"){if(_5ad){_5ad.attr(name,_5b0);}if(this._dim){this.resize(this._dim);}}}}));dojo.style(this.containerNode,"width",(dojo.style(this.containerNode,"width")+200)+"px");},onRemoveChild:function(page,_5b1){var _5b2=this.pane2button[page.id];if(this._selectedTab===_5b2.domNode){this._selectedTab=null;}if(this.useMenu&&page&&page.id&&this._menuChildren[page.id]){this._menu.removeChild(this._menuChildren[page.id]);this._menuChildren[page.id].destroy();delete this._menuChildren[page.id];}this.inherited(arguments);},_initButtons:function(){this._menuChildren={};this._btnWidth=0;this._buttons=dojo.query("> .tabStripButton",this.domNode).filter(function(btn){if((this.useMenu&&btn==this._menuBtn.domNode)||(this.useSlider&&(btn==this._rightBtn.domNode||btn==this._leftBtn.domNode))){this._btnWidth+=dojo.marginBox(btn).w;return true;}else{dojo.style(btn,"display","none");return false;}},this);if(this.useMenu){this._menu=new dijit.Menu({id:this.id+"_menu",targetNodeIds:[this._menuBtn.domNode],leftClickToOpen:true,refocus:false});this._supportingWidgets.push(this._menu);}},_getTabsWidth:function(){var _5b3=this.getChildren();if(_5b3.length){var _5b4=_5b3[this.isLeftToRight()?0:_5b3.length-1].domNode,_5b5=_5b3[this.isLeftToRight()?_5b3.length-1:0].domNode;return _5b5.offsetLeft+dojo.style(_5b5,"width")-_5b4.offsetLeft;}else{return 0;}},_enableBtn:function(_5b6){var _5b7=this._getTabsWidth();_5b6=_5b6||dojo.style(this.scrollNode,"width");return _5b7>0&&_5b6<_5b7;},resize:function(dim){if(this.domNode.offsetWidth==0){return;}this._dim=dim;this.scrollNode.style.height="auto";this._contentBox=dijit.layout.marginBox2contentBox(this.domNode,{h:0,w:dim.w});this._contentBox.h=this.scrollNode.offsetHeight;dojo.contentBox(this.domNode,this._contentBox);var _5b8=this._enableBtn(this._contentBox.w);this._buttons.style("display",_5b8?"":"none");this._leftBtn.layoutAlign="left";this._rightBtn.layoutAlign="right";this._menuBtn.layoutAlign=this.isLeftToRight()?"right":"left";dijit.layout.layoutChildren(this.domNode,this._contentBox,[this._menuBtn,this._leftBtn,this._rightBtn,{domNode:this.scrollNode,layoutAlign:"client"}]);if(this._selectedTab){var w=this.scrollNode,sl=this._convertToScrollLeft(this._getScrollForSelectedTab());w.scrollLeft=sl;}this._setButtonClass(this._getScroll());},_getScroll:function(){var sl=(this.isLeftToRight()||dojo.isIE<8||dojo.isQuirks||dojo.isWebKit)?this.scrollNode.scrollLeft:dojo.style(this.containerNode,"width")-dojo.style(this.scrollNode,"width")+(dojo.isIE==8?-1:1)*this.scrollNode.scrollLeft;return sl;},_convertToScrollLeft:function(val){if(this.isLeftToRight()||dojo.isIE<8||dojo.isQuirks||dojo.isWebKit){return val;}else{var _5b9=dojo.style(this.containerNode,"width")-dojo.style(this.scrollNode,"width");return (dojo.isIE==8?-1:1)*(val-_5b9);}},onSelectChild:function(page){var tab=this.pane2button[page.id];if(!tab||!page){return;}var node=tab.domNode;if(node!=this._selectedTab){this._selectedTab=node;var sl=this._getScroll();if(sl>node.offsetLeft||sl+dojo.style(this.scrollNode,"width")<node.offsetLeft+dojo.style(node,"width")){this.createSmoothScroll().play();}}this.inherited(arguments);},_getScrollBounds:function(){var _5ba=this.getChildren(),_5bb=dojo.style(this.scrollNode,"width"),_5bc=dojo.style(this.containerNode,"width"),_5bd=_5bc-_5bb,_5be=this._getTabsWidth();if(_5ba.length&&_5be>_5bb){return {min:this.isLeftToRight()?0:_5ba[_5ba.length-1].domNode.offsetLeft,max:this.isLeftToRight()?(_5ba[_5ba.length-1].domNode.offsetLeft+dojo.style(_5ba[_5ba.length-1].domNode,"width"))-_5bb:_5bd};}else{var _5bf=this.isLeftToRight()?0:_5bd;return {min:_5bf,max:_5bf};}},_getScrollForSelectedTab:function(){var w=this.scrollNode,n=this._selectedTab,_5c0=dojo.style(this.scrollNode,"width"),_5c1=this._getScrollBounds();var pos=(n.offsetLeft+dojo.style(n,"width")/2)-_5c0/2;pos=Math.min(Math.max(pos,_5c1.min),_5c1.max);return pos;},createSmoothScroll:function(x){if(arguments.length>0){var _5c2=this._getScrollBounds();x=Math.min(Math.max(x,_5c2.min),_5c2.max);}else{x=this._getScrollForSelectedTab();}if(this._anim&&this._anim.status()=="playing"){this._anim.stop();}var self=this,w=this.scrollNode,anim=new dojo._Animation({beforeBegin:function(){if(this.curve){delete this.curve;}var oldS=w.scrollLeft,newS=self._convertToScrollLeft(x);anim.curve=new dojo._Line(oldS,newS);},onAnimate:function(val){w.scrollLeft=val;}});this._anim=anim;this._setButtonClass(x);return anim;},_getBtnNode:function(e){var n=e.target;while(n&&!dojo.hasClass(n,"tabStripButton")){n=n.parentNode;}return n;},doSlideRight:function(e){this.doSlide(1,this._getBtnNode(e));},doSlideLeft:function(e){this.doSlide(-1,this._getBtnNode(e));},doSlide:function(_5c3,node){if(node&&dojo.hasClass(node,"dijitTabBtnDisabled")){return;}var _5c4=dojo.style(this.scrollNode,"width");var d=(_5c4*0.75)*_5c3;var to=this._getScroll()+d;this._setButtonClass(to);this.createSmoothScroll(to).play();},_setButtonClass:function(_5c5){var cls="dijitTabBtnDisabled",_5c6=this._getScrollBounds();dojo.toggleClass(this._leftBtn.domNode,cls,_5c5<=_5c6.min);dojo.toggleClass(this._rightBtn.domNode,cls,_5c5>=_5c6.max);}});dojo.declare("dijit.layout._ScrollingTabControllerButton",dijit.form.Button,{baseClass:"dijitTab",buttonType:"",buttonClass:"",tabPosition:"top",templateString:dojo.cache("dijit.layout","templates/_ScrollingTabControllerButton.html","<div id=\"${id}-${buttonType}\" class=\"tabStripButton dijitTab ${buttonClass} tabStripButton-${tabPosition}\"\n\t\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\">\n\t<div role=\"presentation\" wairole=\"presentation\" class=\"dijitTabInnerDiv\" dojoattachpoint=\"innerDiv,focusNode\">\n\t\t<div role=\"presentation\" wairole=\"presentation\" class=\"dijitTabContent dijitButtonContents\" dojoattachpoint=\"tabContent\">\n\t\t\t<img src=\"${_blankGif}\"/>\n\t\t\t<span dojoAttachPoint=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n\t\t</div>\n\t</div>\n</div>\n"),tabIndex:""});}if(!dojo._hasResource["dijit.layout.TabContainer"]){dojo._hasResource["dijit.layout.TabContainer"]=true;dojo.provide("dijit.layout.TabContainer");dojo.declare("dijit.layout.TabContainer",dijit.layout._TabContainerBase,{useMenu:true,useSlider:true,controllerWidget:"",_makeController:function(_5c7){var cls=this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout"),_5c8=dojo.getObject(this.controllerWidget);return new _5c8({id:this.id+"_tablist",tabPosition:this.tabPosition,doLayout:this.doLayout,containerId:this.id,"class":cls,nested:this.nested,useMenu:this.useMenu,useSlider:this.useSlider,tabStripClass:this.tabStrip?this.baseClass+(this.tabStrip?"":"No")+"Strip":null},_5c7);},postMixInProperties:function(){this.inherited(arguments);if(!this.controllerWidget){this.controllerWidget=(this.tabPosition=="top"||this.tabPosition=="bottom")&&!this.nested?"dijit.layout.ScrollingTabController":"dijit.layout.TabController";}}});}if(!dojo._hasResource["dijit.dijit-all"]){dojo._hasResource["dijit.dijit-all"]=true;console.warn("dijit-all may include much more code than your application actually requires. We strongly recommend that you investigate a custom build or the web build tool");dojo.provide("dijit.dijit-all");}dojo.i18n._preloadLocalizations("dijit.nls.dijit-all",["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"]);
