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

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

		http://dojotoolkit.org

	for documentation and information on getting the source.
*/

if(!dojo._hasResource["dijit._base.manager"]){dojo._hasResource["dijit._base.manager"]=true;dojo.provide("dijit._base.manager");dojo.declare("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_1){if(this._hash[_1.id]){throw new Error("Tried to register widget with id=="+_1.id+" but that id is already registered");}this._hash[_1.id]=_1;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(_2,_3){_3=_3||dojo.global;var i=0,id;for(id in this._hash){_2.call(_3,this._hash[id],i++,this._hash);}return this;},filter:function(_4,_5){_5=_5||dojo.global;var _6=new dijit.WidgetSet(),i=0,id;for(id in this._hash){var w=this._hash[id];if(_4.call(_5,w,i++,this._hash)){_6.add(w);}}return _6;},byId:function(id){return this._hash[id];},byClass:function(_7){var _8=new dijit.WidgetSet(),id,_9;for(id in this._hash){_9=this._hash[id];if(_9.declaredClass==_7){_8.add(_9);}}return _8;},toArray:function(){var ar=[];for(var id in this._hash){ar.push(this._hash[id]);}return ar;},map:function(_a,_b){return dojo.map(this.toArray(),_a,_b);},every:function(_c,_d){_d=_d||dojo.global;var x=0,i;for(i in this._hash){if(!_c.call(_d,this._hash[i],x++,this._hash)){return false;}}return true;},some:function(_e,_f){_f=_f||dojo.global;var x=0,i;for(i in this._hash){if(_e.call(_f,this._hash[i],x++,this._hash)){return true;}}return false;}});dijit.registry=new dijit.WidgetSet();dijit._widgetTypeCtr={};dijit.getUniqueId=function(_10){var id;do{id=_10+"_"+(_10 in dijit._widgetTypeCtr?++dijit._widgetTypeCtr[_10]:dijit._widgetTypeCtr[_10]=0);}while(dijit.byId(id));return dijit._scopeName=="dijit"?id:dijit._scopeName+"_"+id;};dijit.findWidgets=function(_11){var _12=[];function _13(_14){for(var _15=_14.firstChild;_15;_15=_15.nextSibling){if(_15.nodeType==1){var _16=_15.getAttribute("widgetId");if(_16){var _17=dijit.byId(_16);_12.push(_17);}else{_13(_15);}}}};_13(_11);return _12;};dijit._destroyAll=function(){dijit._curFocus=null;dijit._prevFocus=null;dijit._activeStack=[];dojo.forEach(dijit.findWidgets(dojo.body()),function(_18){if(!_18._destroyed){if(_18.destroyRecursive){_18.destroyRecursive();}else{if(_18.destroy){_18.destroy();}}}});};if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit._destroyAll();});}dijit.byId=function(id){return typeof id=="string"?dijit.registry._hash[id]:id;};dijit.byNode=function(_19){return dijit.registry.byId(_19.getAttribute("widgetId"));};dijit.getEnclosingWidget=function(_1a){while(_1a){var id=_1a.getAttribute&&_1a.getAttribute("widgetId");if(id){return dijit.byId(id);}_1a=_1a.parentNode;}return null;};dijit._isElementShown=function(_1b){var _1c=dojo.style(_1b);return (_1c.visibility!="hidden")&&(_1c.visibility!="collapsed")&&(_1c.display!="none")&&(dojo.attr(_1b,"type")!="hidden");};dijit.isTabNavigable=function(_1d){if(dojo.attr(_1d,"disabled")){return false;}else{if(dojo.hasAttr(_1d,"tabIndex")){return dojo.attr(_1d,"tabIndex")>=0;}else{switch(_1d.nodeName.toLowerCase()){case "a":return dojo.hasAttr(_1d,"href");case "area":case "button":case "input":case "object":case "select":case "textarea":return true;case "iframe":if(dojo.isMoz){return _1d.contentDocument.designMode=="on";}else{if(dojo.isWebKit){var doc=_1d.contentDocument,_1e=doc&&doc.body;return _1e&&_1e.contentEditable=="true";}else{try{doc=_1d.contentWindow.document;_1e=doc&&doc.body;return _1e&&_1e.firstChild&&_1e.firstChild.contentEditable=="true";}catch(e){return false;}}}default:return _1d.contentEditable=="true";}}}};dijit._getTabNavigable=function(_1f){var _20,_21,_22,_23,_24,_25;var _26=function(_27){dojo.query("> *",_27).forEach(function(_28){var _29=dijit._isElementShown(_28);if(_29&&dijit.isTabNavigable(_28)){var _2a=dojo.attr(_28,"tabIndex");if(!dojo.hasAttr(_28,"tabIndex")||_2a==0){if(!_20){_20=_28;}_21=_28;}else{if(_2a>0){if(!_22||_2a<_23){_23=_2a;_22=_28;}if(!_24||_2a>=_25){_25=_2a;_24=_28;}}}}if(_29&&_28.nodeName.toUpperCase()!="SELECT"){_26(_28);}});};if(dijit._isElementShown(_1f)){_26(_1f);}return {first:_20,last:_21,lowest:_22,highest:_24};};dijit.getFirstInTabbingOrder=function(_2b){var _2c=dijit._getTabNavigable(dojo.byId(_2b));return _2c.lowest?_2c.lowest:_2c.first;};dijit.getLastInTabbingOrder=function(_2d){var _2e=dijit._getTabNavigable(dojo.byId(_2d));return _2e.last?_2e.last:_2e.highest;};dijit.defaultDuration=dojo.config["defaultDuration"]||200;}if(!dojo._hasResource["dijit._base.focus"]){dojo._hasResource["dijit._base.focus"]=true;dojo.provide("dijit._base.focus");dojo.mixin(dijit,{_curFocus:null,_prevFocus:null,isCollapsed:function(){return dijit.getBookmark().isCollapsed;},getBookmark:function(){var bm,rg,tg,sel=dojo.doc.selection,cf=dijit._curFocus;if(dojo.global.getSelection){sel=dojo.global.getSelection();if(sel){if(sel.isCollapsed){tg=cf?cf.tagName:"";if(tg){tg=tg.toLowerCase();if(tg=="textarea"||(tg=="input"&&(!cf.type||cf.type.toLowerCase()=="text"))){sel={start:cf.selectionStart,end:cf.selectionEnd,node:cf,pRange:true};return {isCollapsed:(sel.end<=sel.start),mark:sel};}}bm={isCollapsed:true};}else{rg=sel.getRangeAt(0);bm={isCollapsed:false,mark:rg.cloneRange()};}}}else{if(sel){tg=cf?cf.tagName:"";tg=tg.toLowerCase();if(cf&&tg&&(tg=="button"||tg=="textarea"||tg=="input")){if(sel.type&&sel.type.toLowerCase()=="none"){return {isCollapsed:true,mark:null};}else{rg=sel.createRange();return {isCollapsed:rg.text&&rg.text.length?false:true,mark:{range:rg,pRange:true}};}}bm={};try{rg=sel.createRange();bm.isCollapsed=!(sel.type=="Text"?rg.htmlText.length:rg.length);}catch(e){bm.isCollapsed=true;return bm;}if(sel.type.toUpperCase()=="CONTROL"){if(rg.length){bm.mark=[];var i=0,len=rg.length;while(i<len){bm.mark.push(rg.item(i++));}}else{bm.isCollapsed=true;bm.mark=null;}}else{bm.mark=rg.getBookmark();}}else{console.warn("No idea how to store the current selection for this browser!");}}return bm;},moveToBookmark:function(_2f){var _30=dojo.doc,_31=_2f.mark;if(_31){if(dojo.global.getSelection){var sel=dojo.global.getSelection();if(sel&&sel.removeAllRanges){if(_31.pRange){var r=_31;var n=r.node;n.selectionStart=r.start;n.selectionEnd=r.end;}else{sel.removeAllRanges();sel.addRange(_31);}}else{console.warn("No idea how to restore selection for this browser!");}}else{if(_30.selection&&_31){var rg;if(_31.pRange){rg=_31.range;}else{if(dojo.isArray(_31)){rg=_30.body.createControlRange();dojo.forEach(_31,function(n){rg.addElement(n);});}else{rg=_30.body.createTextRange();rg.moveToBookmark(_31);}}rg.select();}}}},getFocus:function(_32,_33){var _34=!dijit._curFocus||(_32&&dojo.isDescendant(dijit._curFocus,_32.domNode))?dijit._prevFocus:dijit._curFocus;return {node:_34,bookmark:(_34==dijit._curFocus)&&dojo.withGlobal(_33||dojo.global,dijit.getBookmark),openedForWindow:_33};},focus:function(_35){if(!_35){return;}var _36="node" in _35?_35.node:_35,_37=_35.bookmark,_38=_35.openedForWindow,_39=_37?_37.isCollapsed:false;if(_36){var _3a=(_36.tagName.toLowerCase()=="iframe")?_36.contentWindow:_36;if(_3a&&_3a.focus){try{_3a.focus();}catch(e){}}dijit._onFocusNode(_36);}if(_37&&dojo.withGlobal(_38||dojo.global,dijit.isCollapsed)&&!_39){if(_38){_38.focus();}try{dojo.withGlobal(_38||dojo.global,dijit.moveToBookmark,null,[_37]);}catch(e2){}}},_activeStack:[],registerIframe:function(_3b){return dijit.registerWin(_3b.contentWindow,_3b);},unregisterIframe:function(_3c){dijit.unregisterWin(_3c);},registerWin:function(_3d,_3e){var _3f=function(evt){dijit._justMouseDowned=true;setTimeout(function(){dijit._justMouseDowned=false;},0);dijit._onTouchNode(_3e||evt.target||evt.srcElement,"mouse");};var doc=dojo.isIE?_3d.document.documentElement:_3d.document;if(doc){if(dojo.isIE){doc.attachEvent("onmousedown",_3f);var _40=function(evt){if(evt.srcElement.tagName.toLowerCase()!="#document"&&dijit.isTabNavigable(evt.srcElement)){dijit._onFocusNode(_3e||evt.srcElement);}else{dijit._onTouchNode(_3e||evt.srcElement);}};doc.attachEvent("onactivate",_40);var _41=function(evt){dijit._onBlurNode(_3e||evt.srcElement);};doc.attachEvent("ondeactivate",_41);return function(){doc.detachEvent("onmousedown",_3f);doc.detachEvent("onactivate",_40);doc.detachEvent("ondeactivate",_41);doc=null;};}else{doc.addEventListener("mousedown",_3f,true);var _42=function(evt){dijit._onFocusNode(_3e||evt.target);};doc.addEventListener("focus",_42,true);var _43=function(evt){dijit._onBlurNode(_3e||evt.target);};doc.addEventListener("blur",_43,true);return function(){doc.removeEventListener("mousedown",_3f,true);doc.removeEventListener("focus",_42,true);doc.removeEventListener("blur",_43,true);doc=null;};}}},unregisterWin:function(_44){_44&&_44();},_onBlurNode:function(_45){dijit._prevFocus=dijit._curFocus;dijit._curFocus=null;if(dijit._justMouseDowned){return;}if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);}dijit._clearActiveWidgetsTimer=setTimeout(function(){delete dijit._clearActiveWidgetsTimer;dijit._setStack([]);dijit._prevFocus=null;},100);},_onTouchNode:function(_46,by){if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);delete dijit._clearActiveWidgetsTimer;}var _47=[];try{while(_46){var _48=dojo.attr(_46,"dijitPopupParent");if(_48){_46=dijit.byId(_48).domNode;}else{if(_46.tagName&&_46.tagName.toLowerCase()=="body"){if(_46===dojo.body()){break;}_46=dijit.getDocumentWindow(_46.ownerDocument).frameElement;}else{var id=_46.getAttribute&&_46.getAttribute("widgetId");if(id){_47.unshift(id);}_46=_46.parentNode;}}}}catch(e){}dijit._setStack(_47,by);},_onFocusNode:function(_49){if(!_49){return;}if(_49.nodeType==9){return;}dijit._onTouchNode(_49);if(_49==dijit._curFocus){return;}if(dijit._curFocus){dijit._prevFocus=dijit._curFocus;}dijit._curFocus=_49;dojo.publish("focusNode",[_49]);},_setStack:function(_4a,by){var _4b=dijit._activeStack;dijit._activeStack=_4a;for(var _4c=0;_4c<Math.min(_4b.length,_4a.length);_4c++){if(_4b[_4c]!=_4a[_4c]){break;}}var _4d;for(var i=_4b.length-1;i>=_4c;i--){_4d=dijit.byId(_4b[i]);if(_4d){_4d._focused=false;_4d._hasBeenBlurred=true;if(_4d._onBlur){_4d._onBlur(by);}if(_4d._setStateClass){_4d._setStateClass();}dojo.publish("widgetBlur",[_4d,by]);}}for(i=_4c;i<_4a.length;i++){_4d=dijit.byId(_4a[i]);if(_4d){_4d._focused=true;if(_4d._onFocus){_4d._onFocus(by);}if(_4d._setStateClass){_4d._setStateClass();}dojo.publish("widgetFocus",[_4d,by]);}}}});dojo.addOnLoad(function(){var _4e=dijit.registerWin(window);if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit.unregisterWin(_4e);_4e=null;});}});}if(!dojo._hasResource["dojo.AdapterRegistry"]){dojo._hasResource["dojo.AdapterRegistry"]=true;dojo.provide("dojo.AdapterRegistry");dojo.AdapterRegistry=function(_4f){this.pairs=[];this.returnWrappers=_4f||false;};dojo.extend(dojo.AdapterRegistry,{register:function(_50,_51,_52,_53,_54){this.pairs[((_54)?"unshift":"push")]([_50,_51,_52,_53]);},match:function(){for(var i=0;i<this.pairs.length;i++){var _55=this.pairs[i];if(_55[1].apply(this,arguments)){if((_55[3])||(this.returnWrappers)){return _55[2];}else{return _55[2].apply(this,arguments);}}}throw new Error("No match found");},unregister:function(_56){for(var i=0;i<this.pairs.length;i++){var _57=this.pairs[i];if(_57[0]==_56){this.pairs.splice(i,1);return true;}}return false;}});}if(!dojo._hasResource["dijit._base.place"]){dojo._hasResource["dijit._base.place"]=true;dojo.provide("dijit._base.place");dijit.getViewport=function(){var _58=(dojo.doc.compatMode=="BackCompat")?dojo.body():dojo.doc.documentElement;var _59=dojo._docScroll();return {w:_58.clientWidth,h:_58.clientHeight,l:_59.x,t:_59.y};};dijit.placeOnScreen=function(_5a,pos,_5b,_5c){var _5d=dojo.map(_5b,function(_5e){var c={corner:_5e,pos:{x:pos.x,y:pos.y}};if(_5c){c.pos.x+=_5e.charAt(1)=="L"?_5c.x:-_5c.x;c.pos.y+=_5e.charAt(0)=="T"?_5c.y:-_5c.y;}return c;});return dijit._place(_5a,_5d);};dijit._place=function(_5f,_60,_61){var _62=dijit.getViewport();if(!_5f.parentNode||String(_5f.parentNode.tagName).toLowerCase()!="body"){dojo.body().appendChild(_5f);}var _63=null;dojo.some(_60,function(_64){var _65=_64.corner;var pos=_64.pos;if(_61){_61(_5f,_64.aroundCorner,_65);}var _66=_5f.style;var _67=_66.display;var _68=_66.visibility;_66.visibility="hidden";_66.display="";var mb=dojo.marginBox(_5f);_66.display=_67;_66.visibility=_68;var _69=Math.max(_62.l,_65.charAt(1)=="L"?pos.x:(pos.x-mb.w)),_6a=Math.max(_62.t,_65.charAt(0)=="T"?pos.y:(pos.y-mb.h)),_6b=Math.min(_62.l+_62.w,_65.charAt(1)=="L"?(_69+mb.w):pos.x),_6c=Math.min(_62.t+_62.h,_65.charAt(0)=="T"?(_6a+mb.h):pos.y),_6d=_6b-_69,_6e=_6c-_6a,_6f=(mb.w-_6d)+(mb.h-_6e);if(_63==null||_6f<_63.overflow){_63={corner:_65,aroundCorner:_64.aroundCorner,x:_69,y:_6a,w:_6d,h:_6e,overflow:_6f};}return !_6f;});_5f.style.left=_63.x+"px";_5f.style.top=_63.y+"px";if(_63.overflow&&_61){_61(_5f,_63.aroundCorner,_63.corner);}return _63;};dijit.placeOnScreenAroundNode=function(_70,_71,_72,_73){_71=dojo.byId(_71);var _74=_71.style.display;_71.style.display="";var _75=dojo.position(_71,true);_71.style.display=_74;return dijit._placeOnScreenAroundRect(_70,_75.x,_75.y,_75.w,_75.h,_72,_73);};dijit.placeOnScreenAroundRectangle=function(_76,_77,_78,_79){return dijit._placeOnScreenAroundRect(_76,_77.x,_77.y,_77.width,_77.height,_78,_79);};dijit._placeOnScreenAroundRect=function(_7a,x,y,_7b,_7c,_7d,_7e){var _7f=[];for(var _80 in _7d){_7f.push({aroundCorner:_80,corner:_7d[_80],pos:{x:x+(_80.charAt(1)=="L"?0:_7b),y:y+(_80.charAt(0)=="T"?0:_7c)}});}return dijit._place(_7a,_7f,_7e);};dijit.placementRegistry=new dojo.AdapterRegistry();dijit.placementRegistry.register("node",function(n,x){return typeof x=="object"&&typeof x.offsetWidth!="undefined"&&typeof x.offsetHeight!="undefined";},dijit.placeOnScreenAroundNode);dijit.placementRegistry.register("rect",function(n,x){return typeof x=="object"&&"x" in x&&"y" in x&&"width" in x&&"height" in x;},dijit.placeOnScreenAroundRectangle);dijit.placeOnScreenAroundElement=function(_81,_82,_83,_84){return dijit.placementRegistry.match.apply(dijit.placementRegistry,arguments);};dijit.getPopupAlignment=function(_85,_86){var _87={};dojo.forEach(_85,function(pos){switch(pos){case "after":_87[_86?"BR":"BL"]=_86?"BL":"BR";break;case "before":_87[_86?"BL":"BR"]=_86?"BR":"BL";break;case "below":_87[_86?"BL":"BR"]=_86?"TL":"TR";_87[_86?"BR":"BL"]=_86?"TR":"TL";break;case "above":default:_87[_86?"TL":"TR"]=_86?"BL":"BR";_87[_86?"TR":"TL"]=_86?"BR":"BL";break;}});return _87;};dijit.getPopupAroundAlignment=function(_88,_89){var _8a={};dojo.forEach(_88,function(pos){switch(pos){case "after":_8a[_89?"BR":"BL"]=_89?"BL":"BR";break;case "before":_8a[_89?"BL":"BR"]=_89?"BR":"BL";break;case "below":_8a[_89?"BL":"BR"]=_89?"TL":"TR";_8a[_89?"BR":"BL"]=_89?"TR":"TL";break;case "above":default:_8a[_89?"TL":"TR"]=_89?"BL":"BR";_8a[_89?"TR":"TL"]=_89?"BR":"BL";break;}});return _8a;};}if(!dojo._hasResource["dijit._base.window"]){dojo._hasResource["dijit._base.window"]=true;dojo.provide("dijit._base.window");dijit.getDocumentWindow=function(doc){if(dojo.isIE&&window!==document.parentWindow&&!doc._parentWindow){doc.parentWindow.execScript("document._parentWindow = window;","Javascript");var win=doc._parentWindow;doc._parentWindow=null;return win;}return doc._parentWindow||doc.parentWindow||doc.defaultView;};}if(!dojo._hasResource["dijit._base.popup"]){dojo._hasResource["dijit._base.popup"]=true;dojo.provide("dijit._base.popup");dijit.popup=new function(){var _8b=[],_8c=1000,_8d=1;this.moveOffScreen=function(_8e){var s=_8e.style;s.visibility="hidden";s.position="absolute";s.top="-9999px";if(s.display=="none"){s.display="";}dojo.body().appendChild(_8e);};var _8f=function(){for(var pi=_8b.length-1;pi>0&&_8b[pi].parent===_8b[pi-1].widget;pi--){}return _8b[pi];};var _90=[];this.open=function(_91){var _92=_91.popup,_93=_91.orient||(dojo._isBodyLtr()?{"BL":"TL","BR":"TR","TL":"BL","TR":"BR"}:{"BR":"TR","BL":"TL","TR":"BR","TL":"BL"}),_94=_91.around,id=(_91.around&&_91.around.id)?(_91.around.id+"_dropdown"):("popup_"+_8d++);var _95=_90.pop(),_96,_97;if(!_95){_96=dojo.create("div",{"class":"dijitPopup"},dojo.body());dijit.setWaiRole(_96,"presentation");}else{_96=_95[0];_97=_95[1];}dojo.attr(_96,{id:id,style:{zIndex:_8c+_8b.length,visibility:"hidden",top:"-9999px"},dijitPopupParent:_91.parent?_91.parent.id:""});var s=_92.domNode.style;s.display="";s.visibility="";s.position="";s.top="0px";_96.appendChild(_92.domNode);if(!_97){_97=new dijit.BackgroundIframe(_96);}else{_97.resize(_96);}var _98=_94?dijit.placeOnScreenAroundElement(_96,_94,_93,_92.orient?dojo.hitch(_92,"orient"):null):dijit.placeOnScreen(_96,_91,_93=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],_91.padding);_96.style.visibility="visible";var _99=[];_99.push(dojo.connect(_96,"onkeypress",this,function(evt){if(evt.charOrCode==dojo.keys.ESCAPE&&_91.onCancel){dojo.stopEvent(evt);_91.onCancel();}else{if(evt.charOrCode===dojo.keys.TAB){dojo.stopEvent(evt);var _9a=_8f();if(_9a&&_9a.onCancel){_9a.onCancel();}}}}));if(_92.onCancel){_99.push(dojo.connect(_92,"onCancel",_91.onCancel));}_99.push(dojo.connect(_92,_92.onExecute?"onExecute":"onChange",function(){var _9b=_8f();if(_9b&&_9b.onExecute){_9b.onExecute();}}));_8b.push({wrapper:_96,iframe:_97,widget:_92,parent:_91.parent,onExecute:_91.onExecute,onCancel:_91.onCancel,onClose:_91.onClose,handlers:_99});if(_92.onOpen){_92.onOpen(_98);}return _98;};this.close=function(_9c){while(dojo.some(_8b,function(_9d){return _9d.widget==_9c;})){var top=_8b.pop(),_9e=top.wrapper,_9f=top.iframe,_a0=top.widget,_a1=top.onClose;if(_a0.onClose){_a0.onClose();}dojo.forEach(top.handlers,dojo.disconnect);if(_a0&&_a0.domNode){this.moveOffScreen(_a0.domNode);}_9e.style.top="-9999px";_9e.style.visibility="hidden";_90.push([_9e,_9f]);if(_a1){_a1();}}};}();dijit._frames=new function(){var _a2=[];this.pop=function(){var _a3;if(_a2.length){_a3=_a2.pop();_a3.style.display="";}else{if(dojo.isIE){var _a4=dojo.config["dojoBlankHtmlUrl"]||(dojo.moduleUrl("dojo","resources/blank.html")+"")||"javascript:\"\"";var _a5="<iframe src='"+_a4+"'"+" style='position: absolute; left: 0px; top: 0px;"+"z-index: -1; filter:Alpha(Opacity=\"0\");'>";_a3=dojo.doc.createElement(_a5);}else{_a3=dojo.create("iframe");_a3.src="javascript:\"\"";_a3.className="dijitBackgroundIframe";dojo.style(_a3,"opacity",0.1);}_a3.tabIndex=-1;}return _a3;};this.push=function(_a6){_a6.style.display="none";_a2.push(_a6);};}();dijit.BackgroundIframe=function(_a7){if(!_a7.id){throw new Error("no id");}if(dojo.isIE||dojo.isMoz){var _a8=dijit._frames.pop();_a7.appendChild(_a8);if(dojo.isIE<7){this.resize(_a7);this._conn=dojo.connect(_a7,"onresize",this,function(){this.resize(_a7);});}else{dojo.style(_a8,{width:"100%",height:"100%"});}this.iframe=_a8;}};dojo.extend(dijit.BackgroundIframe,{resize:function(_a9){if(this.iframe&&dojo.isIE<7){dojo.style(this.iframe,{width:_a9.offsetWidth+"px",height:_a9.offsetHeight+"px"});}},destroy:function(){if(this._conn){dojo.disconnect(this._conn);this._conn=null;}if(this.iframe){dijit._frames.push(this.iframe);delete this.iframe;}}});}if(!dojo._hasResource["dijit._base.scroll"]){dojo._hasResource["dijit._base.scroll"]=true;dojo.provide("dijit._base.scroll");dijit.scrollIntoView=function(_aa,pos){try{_aa=dojo.byId(_aa);var doc=_aa.ownerDocument||dojo.doc,_ab=doc.body||dojo.body(),_ac=doc.documentElement||_ab.parentNode,_ad=dojo.isIE,_ae=dojo.isWebKit;if((!(dojo.isMoz||_ad||_ae)||_aa==_ab||_aa==_ac)&&(typeof _aa.scrollIntoView!="undefined")){_aa.scrollIntoView(false);return;}var _af=doc.compatMode=="BackCompat",_b0=_af?_ab:_ac,_b1=_ae?_ab:_b0,_b2=_b0.clientWidth,_b3=_b0.clientHeight,rtl=!dojo._isBodyLtr(),_b4=pos||dojo.position(_aa),el=_aa.parentNode,_b5=function(el){return ((_ad<=6||(_ad&&_af))?false:(dojo.style(el,"position").toLowerCase()=="fixed"));};if(_b5(_aa)){return;}while(el){if(el==_ab){el=_b1;}var _b6=dojo.position(el),_b7=_b5(el);with(_b6){if(el==_b1){w=_b2,h=_b3;if(_b1==_ac&&_ad&&rtl){x+=_b1.offsetWidth-w;}if(x<0||!_ad){x=0;}if(y<0||!_ad){y=0;}}else{var pb=dojo._getPadBorderExtents(el);w-=pb.w;h-=pb.h;x+=pb.l;y+=pb.t;}with(el){if(el!=_b1){var _b8=clientWidth,_b9=w-_b8;if(_b8>0&&_b9>0){w=_b8;if(_ad&&rtl){x+=_b9;}}_b8=clientHeight;_b9=h-_b8;if(_b8>0&&_b9>0){h=_b8;}}if(_b7){if(y<0){h+=y,y=0;}if(x<0){w+=x,x=0;}if(y+h>_b3){h=_b3-y;}if(x+w>_b2){w=_b2-x;}}var l=_b4.x-x,t=_b4.y-Math.max(y,0),r=l+_b4.w-w,bot=t+_b4.h-h;if(r*l>0){var s=Math[l<0?"max":"min"](l,r);_b4.x+=scrollLeft;scrollLeft+=(_ad>=8&&!_af&&rtl)?-s:s;_b4.x-=scrollLeft;}if(bot*t>0){_b4.y+=scrollTop;scrollTop+=Math[t<0?"max":"min"](t,bot);_b4.y-=scrollTop;}}}el=(el!=_b1)&&!_b7&&el.parentNode;}}catch(error){console.error("scrollIntoView: "+error);_aa.scrollIntoView(false);}};}if(!dojo._hasResource["dijit._base.sniff"]){dojo._hasResource["dijit._base.sniff"]=true;dojo.provide("dijit._base.sniff");(function(){var d=dojo,_ba=d.doc.documentElement,ie=d.isIE,_bb=d.isOpera,maj=Math.floor,ff=d.isFF,_bc=d.boxModel.replace(/-/,""),_bd={dj_ie:ie,dj_ie6:maj(ie)==6,dj_ie7:maj(ie)==7,dj_ie8:maj(ie)==8,dj_iequirks:ie&&d.isQuirks,dj_opera:_bb,dj_khtml:d.isKhtml,dj_webkit:d.isWebKit,dj_safari:d.isSafari,dj_chrome:d.isChrome,dj_gecko:d.isMozilla,dj_ff3:maj(ff)==3};_bd["dj_"+_bc]=true;for(var p in _bd){if(_bd[p]){if(_ba.className){_ba.className+=" "+p;}else{_ba.className=p;}}}dojo._loaders.unshift(function(){if(!dojo._isBodyLtr()){_ba.className+=" dijitRtl";for(var p in _bd){if(_bd[p]){_ba.className+=" "+p+"-rtl";}}}});})();}if(!dojo._hasResource["dijit._base.typematic"]){dojo._hasResource["dijit._base.typematic"]=true;dojo.provide("dijit._base.typematic");dijit.typematic={_fireEventAndReload:function(){this._timer=null;this._callback(++this._count,this._node,this._evt);this._currentTimeout=Math.max(this._currentTimeout<0?this._initialDelay:(this._subsequentDelay>1?this._subsequentDelay:Math.round(this._currentTimeout*this._subsequentDelay)),10);this._timer=setTimeout(dojo.hitch(this,"_fireEventAndReload"),this._currentTimeout);},trigger:function(evt,_be,_bf,_c0,obj,_c1,_c2){if(obj!=this._obj){this.stop();this._initialDelay=_c2||500;this._subsequentDelay=_c1||0.9;this._obj=obj;this._evt=evt;this._node=_bf;this._currentTimeout=-1;this._count=-1;this._callback=dojo.hitch(_be,_c0);this._fireEventAndReload();}},stop:function(){if(this._timer){clearTimeout(this._timer);this._timer=null;}if(this._obj){this._callback(-1,this._node,this._evt);this._obj=null;}},addKeyListener:function(_c3,_c4,_c5,_c6,_c7,_c8){if(_c4.keyCode){_c4.charOrCode=_c4.keyCode;dojo.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}else{if(_c4.charCode){_c4.charOrCode=String.fromCharCode(_c4.charCode);dojo.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}}return [dojo.connect(_c3,"onkeypress",this,function(evt){if(evt.charOrCode==_c4.charOrCode&&(_c4.ctrlKey===undefined||_c4.ctrlKey==evt.ctrlKey)&&(_c4.altKey===undefined||_c4.altKey==evt.altKey)&&(_c4.metaKey===undefined||_c4.metaKey==(evt.metaKey||false))&&(_c4.shiftKey===undefined||_c4.shiftKey==evt.shiftKey)){dojo.stopEvent(evt);dijit.typematic.trigger(_c4,_c5,_c3,_c6,_c4,_c7,_c8);}else{if(dijit.typematic._obj==_c4){dijit.typematic.stop();}}}),dojo.connect(_c3,"onkeyup",this,function(evt){if(dijit.typematic._obj==_c4){dijit.typematic.stop();}})];},addMouseListener:function(_c9,_ca,_cb,_cc,_cd){var dc=dojo.connect;return [dc(_c9,"mousedown",this,function(evt){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_ca,_c9,_cb,_c9,_cc,_cd);}),dc(_c9,"mouseup",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(_c9,"mouseout",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(_c9,"mousemove",this,function(evt){dojo.stopEvent(evt);}),dc(_c9,"dblclick",this,function(evt){dojo.stopEvent(evt);if(dojo.isIE){dijit.typematic.trigger(evt,_ca,_c9,_cb,_c9,_cc,_cd);setTimeout(dojo.hitch(this,dijit.typematic.stop),50);}})];},addListener:function(_ce,_cf,_d0,_d1,_d2,_d3,_d4){return this.addKeyListener(_cf,_d0,_d1,_d2,_d3,_d4).concat(this.addMouseListener(_ce,_d1,_d2,_d3,_d4));}};}if(!dojo._hasResource["dijit._base.wai"]){dojo._hasResource["dijit._base.wai"]=true;dojo.provide("dijit._base.wai");dijit.wai={onload:function(){var div=dojo.create("div",{id:"a11yTestNode",style:{cssText:"border: 1px solid;"+"border-color:red green;"+"position: absolute;"+"height: 5px;"+"top: -999px;"+"background-image: url(\""+(dojo.config.blankGif||dojo.moduleUrl("dojo","resources/blank.gif"))+"\");"}},dojo.body());var cs=dojo.getComputedStyle(div);if(cs){var _d5=cs.backgroundImage;var _d6=(cs.borderTopColor==cs.borderRightColor)||(_d5!=null&&(_d5=="none"||_d5=="url(invalid-url:)"));dojo[_d6?"addClass":"removeClass"](dojo.body(),"dijit_a11y");if(dojo.isIE){div.outerHTML="";}else{dojo.body().removeChild(div);}}}};if(dojo.isIE||dojo.isMoz){dojo._loaders.unshift(dijit.wai.onload);}dojo.mixin(dijit,{_XhtmlRoles:/banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,hasWaiRole:function(_d7,_d8){var _d9=this.getWaiRole(_d7);return _d8?(_d9.indexOf(_d8)>-1):(_d9.length>0);},getWaiRole:function(_da){return dojo.trim((dojo.attr(_da,"role")||"").replace(this._XhtmlRoles,"").replace("wairole:",""));},setWaiRole:function(_db,_dc){var _dd=dojo.attr(_db,"role")||"";if(!this._XhtmlRoles.test(_dd)){dojo.attr(_db,"role",_dc);}else{if((" "+_dd+" ").indexOf(" "+_dc+" ")<0){var _de=dojo.trim(_dd.replace(this._XhtmlRoles,""));var _df=dojo.trim(_dd.replace(_de,""));dojo.attr(_db,"role",_df+(_df?" ":"")+_dc);}}},removeWaiRole:function(_e0,_e1){var _e2=dojo.attr(_e0,"role");if(!_e2){return;}if(_e1){var t=dojo.trim((" "+_e2+" ").replace(" "+_e1+" "," "));dojo.attr(_e0,"role",t);}else{_e0.removeAttribute("role");}},hasWaiState:function(_e3,_e4){return _e3.hasAttribute?_e3.hasAttribute("aria-"+_e4):!!_e3.getAttribute("aria-"+_e4);},getWaiState:function(_e5,_e6){return _e5.getAttribute("aria-"+_e6)||"";},setWaiState:function(_e7,_e8,_e9){_e7.setAttribute("aria-"+_e8,_e9);},removeWaiState:function(_ea,_eb){_ea.removeAttribute("aria-"+_eb);}});}if(!dojo._hasResource["dijit._base"]){dojo._hasResource["dijit._base"]=true;dojo.provide("dijit._base");}if(!dojo._hasResource["dijit._Widget"]){dojo._hasResource["dijit._Widget"]=true;dojo.provide("dijit._Widget");dojo.require("dijit._base");dojo.connect(dojo,"_connect",function(_ec,_ed){if(_ec&&dojo.isFunction(_ec._onConnect)){_ec._onConnect(_ed);}});dijit._connectOnUseEventHandler=function(_ee){};dijit._lastKeyDownNode=null;if(dojo.isIE){(function(){var _ef=function(evt){dijit._lastKeyDownNode=evt.srcElement;};dojo.doc.attachEvent("onkeydown",_ef);dojo.addOnWindowUnload(function(){dojo.doc.detachEvent("onkeydown",_ef);});})();}else{dojo.doc.addEventListener("keydown",function(evt){dijit._lastKeyDownNode=evt.target;},true);}(function(){var _f0={},_f1=function(_f2){var dc=_f2.declaredClass;if(!_f0[dc]){var r=[],_f3,_f4=_f2.constructor.prototype;for(var _f5 in _f4){if(dojo.isFunction(_f4[_f5])&&(_f3=_f5.match(/^_set([a-zA-Z]*)Attr$/))&&_f3[1]){r.push(_f3[1].charAt(0).toLowerCase()+_f3[1].substr(1));}}_f0[dc]=r;}return _f0[dc]||[];};dojo.declare("dijit._Widget",null,{id:"",lang:"",dir:"","class":"",style:"",title:"",tooltip:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{id:"",dir:"",lang:"","class":"",style:"",title:""},_deferredConnects:{onClick:"",onDblClick:"",onKeyDown:"",onKeyPress:"",onKeyUp:"",onMouseMove:"",onMouseDown:"",onMouseOut:"",onMouseOver:"",onMouseLeave:"",onMouseEnter:"",onMouseUp:""},onClick:dijit._connectOnUseEventHandler,onDblClick:dijit._connectOnUseEventHandler,onKeyDown:dijit._connectOnUseEventHandler,onKeyPress:dijit._connectOnUseEventHandler,onKeyUp:dijit._connectOnUseEventHandler,onMouseDown:dijit._connectOnUseEventHandler,onMouseMove:dijit._connectOnUseEventHandler,onMouseOut:dijit._connectOnUseEventHandler,onMouseOver:dijit._connectOnUseEventHandler,onMouseLeave:dijit._connectOnUseEventHandler,onMouseEnter:dijit._connectOnUseEventHandler,onMouseUp:dijit._connectOnUseEventHandler,_blankGif:(dojo.config.blankGif||dojo.moduleUrl("dojo","resources/blank.gif")).toString(),postscript:function(_f6,_f7){this.create(_f6,_f7);},create:function(_f8,_f9){this.srcNodeRef=dojo.byId(_f9);this._connects=[];this._subscribes=[];this._deferredConnects=dojo.clone(this._deferredConnects);for(var _fa in this.attributeMap){delete this._deferredConnects[_fa];}for(_fa in this._deferredConnects){if(this[_fa]!==dijit._connectOnUseEventHandler){delete this._deferredConnects[_fa];}}if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_f8){this.params=_f8;dojo.mixin(this,_f8);}this.postMixInProperties();if(!this.id){this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));}dijit.registry.add(this);this.buildRendering();if(this.domNode){this._applyAttributes();var _fb=this.srcNodeRef;if(_fb&&_fb.parentNode){_fb.parentNode.replaceChild(this.domNode,_fb);}for(_fa in this.params){this._onConnect(_fa);}}if(this.domNode){this.domNode.setAttribute("widgetId",this.id);}this.postCreate();if(this.srcNodeRef&&!this.srcNodeRef.parentNode){delete this.srcNodeRef;}this._created=true;},_applyAttributes:function(){var _fc=function(_fd,_fe){if((_fe.params&&_fd in _fe.params)||_fe[_fd]){_fe.attr(_fd,_fe[_fd]);}};for(var _ff in this.attributeMap){_fc(_ff,this);}dojo.forEach(_f1(this),function(a){if(!(a in this.attributeMap)){_fc(a,this);}},this);},postMixInProperties:function(){},buildRendering:function(){this.domNode=this.srcNodeRef||dojo.create("div");},postCreate:function(){},startup:function(){this._started=true;},destroyRecursive:function(_100){this._beingDestroyed=true;this.destroyDescendants(_100);this.destroy(_100);},destroy:function(_101){this._beingDestroyed=true;this.uninitialize();var d=dojo,dfe=d.forEach,dun=d.unsubscribe;dfe(this._connects,function(_102){dfe(_102,d.disconnect);});dfe(this._subscribes,function(_103){dun(_103);});dfe(this._supportingWidgets||[],function(w){if(w.destroyRecursive){w.destroyRecursive();}else{if(w.destroy){w.destroy();}}});this.destroyRendering(_101);dijit.registry.remove(this.id);this._destroyed=true;},destroyRendering:function(_104){if(this.bgIframe){this.bgIframe.destroy(_104);delete this.bgIframe;}if(this.domNode){if(_104){dojo.removeAttr(this.domNode,"widgetId");}else{dojo.destroy(this.domNode);}delete this.domNode;}if(this.srcNodeRef){if(!_104){dojo.destroy(this.srcNodeRef);}delete this.srcNodeRef;}},destroyDescendants:function(_105){dojo.forEach(this.getChildren(),function(_106){if(_106.destroyRecursive){_106.destroyRecursive(_105);}});},uninitialize:function(){return false;},onFocus:function(){},onBlur:function(){},_onFocus:function(e){this.onFocus();},_onBlur:function(){this.onBlur();},_onConnect:function(_107){if(_107 in this._deferredConnects){var _108=this[this._deferredConnects[_107]||"domNode"];this.connect(_108,_107.toLowerCase(),_107);delete this._deferredConnects[_107];}},_setClassAttr:function(_109){var _10a=this[this.attributeMap["class"]||"domNode"];dojo.removeClass(_10a,this["class"]);this["class"]=_109;dojo.addClass(_10a,_109);},_setStyleAttr:function(_10b){var _10c=this[this.attributeMap.style||"domNode"];if(dojo.isObject(_10b)){dojo.style(_10c,_10b);}else{if(_10c.style.cssText){_10c.style.cssText+="; "+_10b;}else{_10c.style.cssText=_10b;}}this.style=_10b;},setAttribute:function(attr,_10d){dojo.deprecated(this.declaredClass+"::setAttribute() is deprecated. Use attr() instead.","","2.0");this.attr(attr,_10d);},_attrToDom:function(attr,_10e){var _10f=this.attributeMap[attr];dojo.forEach(dojo.isArray(_10f)?_10f:[_10f],function(_110){var _111=this[_110.node||_110||"domNode"];var type=_110.type||"attribute";switch(type){case "attribute":if(dojo.isFunction(_10e)){_10e=dojo.hitch(this,_10e);}var _112=_110.attribute?_110.attribute:(/^on[A-Z][a-zA-Z]*$/.test(attr)?attr.toLowerCase():attr);dojo.attr(_111,_112,_10e);break;case "innerText":_111.innerHTML="";_111.appendChild(dojo.doc.createTextNode(_10e));break;case "innerHTML":_111.innerHTML=_10e;break;case "class":dojo.removeClass(_111,this[attr]);dojo.addClass(_111,_10e);break;}},this);this[attr]=_10e;},attr:function(name,_113){var args=arguments.length;if(args==1&&!dojo.isString(name)){for(var x in name){this.attr(x,name[x]);}return this;}var _114=this._getAttrNames(name);if(args>=2){if(this[_114.s]){args=dojo._toArray(arguments,1);return this[_114.s].apply(this,args)||this;}else{if(name in this.attributeMap){this._attrToDom(name,_113);}this[name]=_113;}return this;}else{return this[_114.g]?this[_114.g]():this[name];}},_attrPairNames:{},_getAttrNames:function(name){var apn=this._attrPairNames;if(apn[name]){return apn[name];}var uc=name.charAt(0).toUpperCase()+name.substr(1);return (apn[name]={n:name+"Node",s:"_set"+uc+"Attr",g:"_get"+uc+"Attr"});},toString:function(){return "[Widget "+this.declaredClass+", "+(this.id||"NO ID")+"]";},getDescendants:function(){return this.containerNode?dojo.query("[widgetId]",this.containerNode).map(dijit.byNode):[];},getChildren:function(){return this.containerNode?dijit.findWidgets(this.containerNode):[];},nodesWithKeyClick:["input","button"],connect:function(obj,_115,_116){var d=dojo,dc=d._connect,_117=[];if(_115=="ondijitclick"){if(!this.nodesWithKeyClick[obj.tagName.toLowerCase()]){var m=d.hitch(this,_116);_117.push(dc(obj,"onkeydown",this,function(e){if((e.keyCode==d.keys.ENTER||e.keyCode==d.keys.SPACE)&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){dijit._lastKeyDownNode=e.target;d.stopEvent(e);}}),dc(obj,"onkeyup",this,function(e){if((e.keyCode==d.keys.ENTER||e.keyCode==d.keys.SPACE)&&e.target===dijit._lastKeyDownNode&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){dijit._lastKeyDownNode=null;return m(e);}}));}_115="onclick";}_117.push(dc(obj,_115,this,_116));this._connects.push(_117);return _117;},disconnect:function(_118){for(var i=0;i<this._connects.length;i++){if(this._connects[i]==_118){dojo.forEach(_118,dojo.disconnect);this._connects.splice(i,1);return;}}},subscribe:function(_119,_11a){var d=dojo,_11b=d.subscribe(_119,this,_11a);this._subscribes.push(_11b);return _11b;},unsubscribe:function(_11c){for(var i=0;i<this._subscribes.length;i++){if(this._subscribes[i]==_11c){dojo.unsubscribe(_11c);this._subscribes.splice(i,1);return;}}},isLeftToRight:function(){return dojo._isBodyLtr();},isFocusable:function(){return this.focus&&(dojo.style(this.domNode,"display")!="none");},placeAt:function(_11d,_11e){if(_11d.declaredClass&&_11d.addChild){_11d.addChild(this,_11e);}else{dojo.place(this.domNode,_11d,_11e);}return this;},_onShow:function(){this.onShow();},onShow:function(){},onHide:function(){}});})();}if(!dojo._hasResource["dojox.gfx.matrix"]){dojo._hasResource["dojox.gfx.matrix"]=true;dojo.provide("dojox.gfx.matrix");(function(){var m=dojox.gfx.matrix;var _11f={};m._degToRad=function(_120){return _11f[_120]||(_11f[_120]=(Math.PI*_120/180));};m._radToDeg=function(_121){return _121/Math.PI*180;};m.Matrix2D=function(arg){if(arg){if(typeof arg=="number"){this.xx=this.yy=arg;}else{if(arg instanceof Array){if(arg.length>0){var _122=m.normalize(arg[0]);for(var i=1;i<arg.length;++i){var l=_122,r=dojox.gfx.matrix.normalize(arg[i]);_122=new m.Matrix2D();_122.xx=l.xx*r.xx+l.xy*r.yx;_122.xy=l.xx*r.xy+l.xy*r.yy;_122.yx=l.yx*r.xx+l.yy*r.yx;_122.yy=l.yx*r.xy+l.yy*r.yy;_122.dx=l.xx*r.dx+l.xy*r.dy+l.dx;_122.dy=l.yx*r.dx+l.yy*r.dy+l.dy;}dojo.mixin(this,_122);}}else{dojo.mixin(this,arg);}}}};dojo.extend(m.Matrix2D,{xx:1,xy:0,yx:0,yy:1,dx:0,dy:0});dojo.mixin(m,{identity:new m.Matrix2D(),flipX:new m.Matrix2D({xx:-1}),flipY:new m.Matrix2D({yy:-1}),flipXY:new m.Matrix2D({xx:-1,yy:-1}),translate:function(a,b){if(arguments.length>1){return new m.Matrix2D({dx:a,dy:b});}return new m.Matrix2D({dx:a.x,dy:a.y});},scale:function(a,b){if(arguments.length>1){return new m.Matrix2D({xx:a,yy:b});}if(typeof a=="number"){return new m.Matrix2D({xx:a,yy:a});}return new m.Matrix2D({xx:a.x,yy:a.y});},rotate:function(_123){var c=Math.cos(_123);var s=Math.sin(_123);return new m.Matrix2D({xx:c,xy:-s,yx:s,yy:c});},rotateg:function(_124){return m.rotate(m._degToRad(_124));},skewX:function(_125){return new m.Matrix2D({xy:Math.tan(_125)});},skewXg:function(_126){return m.skewX(m._degToRad(_126));},skewY:function(_127){return new m.Matrix2D({yx:Math.tan(_127)});},skewYg:function(_128){return m.skewY(m._degToRad(_128));},reflect:function(a,b){if(arguments.length==1){b=a.y;a=a.x;}var a2=a*a,b2=b*b,n2=a2+b2,xy=2*a*b/n2;return new m.Matrix2D({xx:2*a2/n2-1,xy:xy,yx:xy,yy:2*b2/n2-1});},project:function(a,b){if(arguments.length==1){b=a.y;a=a.x;}var a2=a*a,b2=b*b,n2=a2+b2,xy=a*b/n2;return new m.Matrix2D({xx:a2/n2,xy:xy,yx:xy,yy:b2/n2});},normalize:function(_129){return (_129 instanceof m.Matrix2D)?_129:new m.Matrix2D(_129);},clone:function(_12a){var obj=new m.Matrix2D();for(var i in _12a){if(typeof (_12a[i])=="number"&&typeof (obj[i])=="number"&&obj[i]!=_12a[i]){obj[i]=_12a[i];}}return obj;},invert:function(_12b){var M=m.normalize(_12b),D=M.xx*M.yy-M.xy*M.yx,M=new m.Matrix2D({xx:M.yy/D,xy:-M.xy/D,yx:-M.yx/D,yy:M.xx/D,dx:(M.xy*M.dy-M.yy*M.dx)/D,dy:(M.yx*M.dx-M.xx*M.dy)/D});return M;},_multiplyPoint:function(_12c,x,y){return {x:_12c.xx*x+_12c.xy*y+_12c.dx,y:_12c.yx*x+_12c.yy*y+_12c.dy};},multiplyPoint:function(_12d,a,b){var M=m.normalize(_12d);if(typeof a=="number"&&typeof b=="number"){return m._multiplyPoint(M,a,b);}return m._multiplyPoint(M,a.x,a.y);},multiply:function(_12e){var M=m.normalize(_12e);for(var i=1;i<arguments.length;++i){var l=M,r=m.normalize(arguments[i]);M=new m.Matrix2D();M.xx=l.xx*r.xx+l.xy*r.yx;M.xy=l.xx*r.xy+l.xy*r.yy;M.yx=l.yx*r.xx+l.yy*r.yx;M.yy=l.yx*r.xy+l.yy*r.yy;M.dx=l.xx*r.dx+l.xy*r.dy+l.dx;M.dy=l.yx*r.dx+l.yy*r.dy+l.dy;}return M;},_sandwich:function(_12f,x,y){return m.multiply(m.translate(x,y),_12f,m.translate(-x,-y));},scaleAt:function(a,b,c,d){switch(arguments.length){case 4:return m._sandwich(m.scale(a,b),c,d);case 3:if(typeof c=="number"){return m._sandwich(m.scale(a),b,c);}return m._sandwich(m.scale(a,b),c.x,c.y);}return m._sandwich(m.scale(a),b.x,b.y);},rotateAt:function(_130,a,b){if(arguments.length>2){return m._sandwich(m.rotate(_130),a,b);}return m._sandwich(m.rotate(_130),a.x,a.y);},rotategAt:function(_131,a,b){if(arguments.length>2){return m._sandwich(m.rotateg(_131),a,b);}return m._sandwich(m.rotateg(_131),a.x,a.y);},skewXAt:function(_132,a,b){if(arguments.length>2){return m._sandwich(m.skewX(_132),a,b);}return m._sandwich(m.skewX(_132),a.x,a.y);},skewXgAt:function(_133,a,b){if(arguments.length>2){return m._sandwich(m.skewXg(_133),a,b);}return m._sandwich(m.skewXg(_133),a.x,a.y);},skewYAt:function(_134,a,b){if(arguments.length>2){return m._sandwich(m.skewY(_134),a,b);}return m._sandwich(m.skewY(_134),a.x,a.y);},skewYgAt:function(_135,a,b){if(arguments.length>2){return m._sandwich(m.skewYg(_135),a,b);}return m._sandwich(m.skewYg(_135),a.x,a.y);}});})();dojox.gfx.Matrix2D=dojox.gfx.matrix.Matrix2D;}if(!dojo._hasResource["dojox.gfx._base"]){dojo._hasResource["dojox.gfx._base"]=true;dojo.provide("dojox.gfx._base");(function(){var g=dojox.gfx,b=g._base;g._hasClass=function(node,_136){var cls=node.getAttribute("className");return cls&&(" "+cls+" ").indexOf(" "+_136+" ")>=0;};g._addClass=function(node,_137){var cls=node.getAttribute("className")||"";if(!cls||(" "+cls+" ").indexOf(" "+_137+" ")<0){node.setAttribute("className",cls+(cls?" ":"")+_137);}};g._removeClass=function(node,_138){var cls=node.getAttribute("className");if(cls){node.setAttribute("className",cls.replace(new RegExp("(^|\\s+)"+_138+"(\\s+|$)"),"$1$2"));}};b._getFontMeasurements=function(){var _139={"1em":0,"1ex":0,"100%":0,"12pt":0,"16px":0,"xx-small":0,"x-small":0,"small":0,"medium":0,"large":0,"x-large":0,"xx-large":0};if(dojo.isIE){dojo.doc.documentElement.style.fontSize="100%";}var div=dojo.doc.createElement("div");var s=div.style;s.position="absolute";s.left="-100px";s.top="0px";s.width="30px";s.height="1000em";s.border="0px";s.margin="0px";s.padding="0px";s.outline="none";s.lineHeight="1";s.overflow="hidden";dojo.body().appendChild(div);for(var p in _139){div.style.fontSize=p;_139[p]=Math.round(div.offsetHeight*12/16)*16/12/1000;}dojo.body().removeChild(div);div=null;return _139;};var _13a=null;b._getCachedFontMeasurements=function(_13b){if(_13b||!_13a){_13a=b._getFontMeasurements();}return _13a;};var _13c=null,_13d={};b._getTextBox=function(text,_13e,_13f){var m,s,al=arguments.length;if(!_13c){m=_13c=dojo.doc.createElement("div");s=m.style;s.position="absolute";s.left="-10000px";s.top="0";dojo.body().appendChild(m);}else{m=_13c;s=m.style;}m.className="";s.border="0";s.margin="0";s.padding="0";s.outline="0";if(al>1&&_13e){for(var i in _13e){if(i in _13d){continue;}s[i]=_13e[i];}}if(al>2&&_13f){m.className=_13f;}m.innerHTML=text;if(m["getBoundingClientRect"]){var bcr=m.getBoundingClientRect();return {l:bcr.left,t:bcr.top,w:bcr.width||(bcr.right-bcr.left),h:bcr.height||(bcr.bottom-bcr.top)};}else{return dojo.marginBox(m);}};var _140=0;b._getUniqueId=function(){var id;do{id=dojo._scopeName+"Unique"+(++_140);}while(dojo.byId(id));return id;};})();dojo.mixin(dojox.gfx,{defaultPath:{type:"path",path:""},defaultPolyline:{type:"polyline",points:[]},defaultRect:{type:"rect",x:0,y:0,width:100,height:100,r:0},defaultEllipse:{type:"ellipse",cx:0,cy:0,rx:200,ry:100},defaultCircle:{type:"circle",cx:0,cy:0,r:100},defaultLine:{type:"line",x1:0,y1:0,x2:100,y2:100},defaultImage:{type:"image",x:0,y:0,width:0,height:0,src:""},defaultText:{type:"text",x:0,y:0,text:"",align:"start",decoration:"none",rotated:false,kerning:true},defaultTextPath:{type:"textpath",text:"",align:"start",decoration:"none",rotated:false,kerning:true},defaultStroke:{type:"stroke",color:"black",style:"solid",width:1,cap:"butt",join:4},defaultLinearGradient:{type:"linear",x1:0,y1:0,x2:100,y2:100,colors:[{offset:0,color:"black"},{offset:1,color:"white"}]},defaultRadialGradient:{type:"radial",cx:0,cy:0,r:100,colors:[{offset:0,color:"black"},{offset:1,color:"white"}]},defaultPattern:{type:"pattern",x:0,y:0,width:0,height:0,src:""},defaultFont:{type:"font",style:"normal",variant:"normal",weight:"normal",size:"10pt",family:"serif"},getDefault:(function(){var _141={};return function(type){var t=_141[type];if(t){return new t();}t=_141[type]=new Function;t.prototype=dojox.gfx["default"+type];return new t();};})(),normalizeColor:function(_142){return (_142 instanceof dojo.Color)?_142:new dojo.Color(_142);},normalizeParameters:function(_143,_144){if(_144){var _145={};for(var x in _143){if(x in _144&&!(x in _145)){_143[x]=_144[x];}}}return _143;},makeParameters:function(_146,_147){if(!_147){return dojo.delegate(_146);}var _148={};for(var i in _146){if(!(i in _148)){_148[i]=dojo.clone((i in _147)?_147[i]:_146[i]);}}return _148;},formatNumber:function(x,_149){var val=x.toString();if(val.indexOf("e")>=0){val=x.toFixed(4);}else{var _14a=val.indexOf(".");if(_14a>=0&&val.length-_14a>5){val=x.toFixed(4);}}if(x<0){return val;}return _149?" "+val:val;},makeFontString:function(font){return font.style+" "+font.variant+" "+font.weight+" "+font.size+" "+font.family;},splitFontString:function(str){var font=dojox.gfx.getDefault("Font");var t=str.split(/\s+/);do{if(t.length<5){break;}font.style=t[0];font.variant=t[1];font.weight=t[2];var i=t[3].indexOf("/");font.size=i<0?t[3]:t[3].substring(0,i);var j=4;if(i<0){if(t[4]=="/"){j=6;}else{if(t[4].charAt(0)=="/"){j=5;}}}if(j<t.length){font.family=t.slice(j).join(" ");}}while(false);return font;},cm_in_pt:72/2.54,mm_in_pt:7.2/2.54,px_in_pt:function(){return dojox.gfx._base._getCachedFontMeasurements()["12pt"]/12;},pt2px:function(len){return len*dojox.gfx.px_in_pt();},px2pt:function(len){return len/dojox.gfx.px_in_pt();},normalizedLength:function(len){if(len.length==0){return 0;}if(len.length>2){var _14b=dojox.gfx.px_in_pt();var val=parseFloat(len);switch(len.slice(-2)){case "px":return val;case "pt":return val*_14b;case "in":return val*72*_14b;case "pc":return val*12*_14b;case "mm":return val*dojox.gfx.mm_in_pt*_14b;case "cm":return val*dojox.gfx.cm_in_pt*_14b;}}return parseFloat(len);},pathVmlRegExp:/([A-Za-z]+)|(\d+(\.\d+)?)|(\.\d+)|(-\d+(\.\d+)?)|(-\.\d+)/g,pathSvgRegExp:/([A-Za-z])|(\d+(\.\d+)?)|(\.\d+)|(-\d+(\.\d+)?)|(-\.\d+)/g,equalSources:function(a,b){return a&&b&&a==b;}});}if(!dojo._hasResource["dojox.gfx"]){dojo._hasResource["dojox.gfx"]=true;dojo.provide("dojox.gfx");dojo.loadInit(function(){var gfx=dojo.getObject("dojox.gfx",true),sl,flag,_14c;if(!gfx.renderer){if(dojo.config.forceGfxRenderer){dojox.gfx.renderer=dojo.config.forceGfxRenderer;return;}var _14d=(typeof dojo.config.gfxRenderer=="string"?dojo.config.gfxRenderer:"svg,vml,silverlight,canvas").split(",");var ua=navigator.userAgent,_14e=0,_14f=0;if(dojo.isSafari>=3){if(ua.indexOf("iPhone")>=0||ua.indexOf("iPod")>=0){_14c=ua.match(/Version\/(\d(\.\d)?(\.\d)?)\sMobile\/([^\s]*)\s?/);if(_14c){_14e=parseInt(_14c[4].substr(0,3),16);}}}if(dojo.isWebKit){if(!_14e){_14c=ua.match(/Android\s+(\d+\.\d+)/);if(_14c){_14f=parseFloat(_14c[1]);}}}for(var i=0;i<_14d.length;++i){switch(_14d[i]){case "svg":if(!dojo.isIE&&(!_14e||_14e>=1521)&&!_14f&&!dojo.isAIR){dojox.gfx.renderer="svg";}break;case "vml":if(dojo.isIE){dojox.gfx.renderer="vml";}break;case "silverlight":try{if(dojo.isIE){sl=new ActiveXObject("AgControl.AgControl");if(sl&&sl.IsVersionSupported("1.0")){flag=true;}}else{if(navigator.plugins["Silverlight Plug-In"]){flag=true;}}}catch(e){flag=false;}finally{sl=null;}if(flag){dojox.gfx.renderer="silverlight";}break;case "canvas":if(!dojo.isIE){dojox.gfx.renderer="canvas";}break;}if(dojox.gfx.renderer){break;}}if(dojo.config.isDebug){}}});dojo.requireIf(dojox.gfx.renderer=="svg","dojox.gfx.svg");dojo.requireIf(dojox.gfx.renderer=="vml","dojox.gfx.vml");dojo.requireIf(dojox.gfx.renderer=="silverlight","dojox.gfx.silverlight");dojo.requireIf(dojox.gfx.renderer=="canvas","dojox.gfx.canvas");}if(!dojo._hasResource["dojox.lang.functional.lambda"]){dojo._hasResource["dojox.lang.functional.lambda"]=true;dojo.provide("dojox.lang.functional.lambda");(function(){var df=dojox.lang.functional,_150={};var _151="ab".split(/a*/).length>1?String.prototype.split:function(sep){var r=this.split.call(this,sep),m=sep.exec(this);if(m&&m.index==0){r.unshift("");}return r;};var _152=function(s){var args=[],_153=_151.call(s,/\s*->\s*/m);if(_153.length>1){while(_153.length){s=_153.pop();args=_153.pop().split(/\s*,\s*|\s+/m);if(_153.length){_153.push("(function("+args+"){return ("+s+")})");}}}else{if(s.match(/\b_\b/)){args=["_"];}else{var l=s.match(/^\s*(?:[+*\/%&|\^\.=<>]|!=)/m),r=s.match(/[+\-*\/%&|\^\.=<>!]\s*$/m);if(l||r){if(l){args.push("$1");s="$1"+s;}if(r){args.push("$2");s=s+"$2";}}else{var vars=s.replace(/(?:\b[A-Z]|\.[a-zA-Z_$])[a-zA-Z_$\d]*|[a-zA-Z_$][a-zA-Z_$\d]*:|this|true|false|null|undefined|typeof|instanceof|in|delete|new|void|arguments|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|escape|eval|isFinite|isNaN|parseFloat|parseInt|unescape|dojo|dijit|dojox|window|document|'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"/g,"").match(/([a-z_$][a-z_$\d]*)/gi)||[],t={};dojo.forEach(vars,function(v){if(!(v in t)){args.push(v);t[v]=1;}});}}}return {args:args,body:s};};var _154=function(a){return a.length?function(){var i=a.length-1,x=df.lambda(a[i]).apply(this,arguments);for(--i;i>=0;--i){x=df.lambda(a[i]).call(this,x);}return x;}:function(x){return x;};};dojo.mixin(df,{rawLambda:function(s){return _152(s);},buildLambda:function(s){s=_152(s);return "function("+s.args.join(",")+"){return ("+s.body+");}";},lambda:function(s){if(typeof s=="function"){return s;}if(s instanceof Array){return _154(s);}if(s in _150){return _150[s];}s=_152(s);return _150[s]=new Function(s.args,"return ("+s.body+");");},clearLambdaCache:function(){_150={};}});})();}if(!dojo._hasResource["dojox.lang.functional.array"]){dojo._hasResource["dojox.lang.functional.array"]=true;dojo.provide("dojox.lang.functional.array");(function(){var d=dojo,df=dojox.lang.functional,_155={};d.mixin(df,{filter:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var t=[],v,i,n;if(d.isArray(a)){for(i=0,n=a.length;i<n;++i){v=a[i];if(f.call(o,v,i,a)){t.push(v);}}}else{if(typeof a.hasNext=="function"&&typeof a.next=="function"){for(i=0;a.hasNext();){v=a.next();if(f.call(o,v,i++,a)){t.push(v);}}}else{for(i in a){if(!(i in _155)){v=a[i];if(f.call(o,v,i,a)){t.push(v);}}}}}return t;},forEach:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var i,n;if(d.isArray(a)){for(i=0,n=a.length;i<n;f.call(o,a[i],i,a),++i){}}else{if(typeof a.hasNext=="function"&&typeof a.next=="function"){for(i=0;a.hasNext();f.call(o,a.next(),i++,a)){}}else{for(i in a){if(!(i in _155)){f.call(o,a[i],i,a);}}}}return o;},map:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var t,n,i;if(d.isArray(a)){t=new Array(n=a.length);for(i=0;i<n;t[i]=f.call(o,a[i],i,a),++i){}}else{if(typeof a.hasNext=="function"&&typeof a.next=="function"){t=[];for(i=0;a.hasNext();t.push(f.call(o,a.next(),i++,a))){}}else{t=[];for(i in a){if(!(i in _155)){t.push(f.call(o,a[i],i,a));}}}}return t;},every:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var i,n;if(d.isArray(a)){for(i=0,n=a.length;i<n;++i){if(!f.call(o,a[i],i,a)){return false;}}}else{if(typeof a.hasNext=="function"&&typeof a.next=="function"){for(i=0;a.hasNext();){if(!f.call(o,a.next(),i++,a)){return false;}}}else{for(i in a){if(!(i in _155)){if(!f.call(o,a[i],i,a)){return false;}}}}}return true;},some:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var i,n;if(d.isArray(a)){for(i=0,n=a.length;i<n;++i){if(f.call(o,a[i],i,a)){return true;}}}else{if(typeof a.hasNext=="function"&&typeof a.next=="function"){for(i=0;a.hasNext();){if(f.call(o,a.next(),i++,a)){return true;}}}else{for(i in a){if(!(i in _155)){if(f.call(o,a[i],i,a)){return true;}}}}}return false;}});})();}if(!dojo._hasResource["dojox.lang.functional.object"]){dojo._hasResource["dojox.lang.functional.object"]=true;dojo.provide("dojox.lang.functional.object");(function(){var d=dojo,df=dojox.lang.functional,_156={};d.mixin(df,{keys:function(obj){var t=[];for(var i in obj){if(!(i in _156)){t.push(i);}}return t;},values:function(obj){var t=[];for(var i in obj){if(!(i in _156)){t.push(obj[i]);}}return t;},filterIn:function(obj,f,o){o=o||d.global;f=df.lambda(f);var t={},v,i;for(i in obj){if(!(i in _156)){v=obj[i];if(f.call(o,v,i,obj)){t[i]=v;}}}return t;},forIn:function(obj,f,o){o=o||d.global;f=df.lambda(f);for(var i in obj){if(!(i in _156)){f.call(o,obj[i],i,obj);}}return o;},mapIn:function(obj,f,o){o=o||d.global;f=df.lambda(f);var t={},i;for(i in obj){if(!(i in _156)){t[i]=f.call(o,obj[i],i,obj);}}return t;}});})();}if(!dojo._hasResource["dojox.lang.functional"]){dojo._hasResource["dojox.lang.functional"]=true;dojo.provide("dojox.lang.functional");}if(!dojo._hasResource["dojox.lang.functional.fold"]){dojo._hasResource["dojox.lang.functional.fold"]=true;dojo.provide("dojox.lang.functional.fold");(function(){var d=dojo,df=dojox.lang.functional,_157={};d.mixin(df,{foldl:function(a,f,z,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var i,n;if(d.isArray(a)){for(i=0,n=a.length;i<n;z=f.call(o,z,a[i],i,a),++i){}}else{if(typeof a.hasNext=="function"&&typeof a.next=="function"){for(i=0;a.hasNext();z=f.call(o,z,a.next(),i++,a)){}}else{for(i in a){if(!(i in _157)){z=f.call(o,z,a[i],i,a);}}}}return z;},foldl1:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var z,i,n;if(d.isArray(a)){z=a[0];for(i=1,n=a.length;i<n;z=f.call(o,z,a[i],i,a),++i){}}else{if(typeof a.hasNext=="function"&&typeof a.next=="function"){if(a.hasNext()){z=a.next();for(i=1;a.hasNext();z=f.call(o,z,a.next(),i++,a)){}}}else{var _158=true;for(i in a){if(!(i in _157)){if(_158){z=a[i];_158=false;}else{z=f.call(o,z,a[i],i,a);}}}}}return z;},foldr:function(a,f,z,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);for(var i=a.length;i>0;--i,z=f.call(o,z,a[i],i,a)){}return z;},foldr1:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var n=a.length,z=a[n-1],i=n-1;for(;i>0;--i,z=f.call(o,z,a[i],i,a)){}return z;},reduce:function(a,f,z){return arguments.length<3?df.foldl1(a,f):df.foldl(a,f,z);},reduceRight:function(a,f,z){return arguments.length<3?df.foldr1(a,f):df.foldr(a,f,z);},unfold:function(pr,f,g,z,o){o=o||d.global;f=df.lambda(f);g=df.lambda(g);pr=df.lambda(pr);var t=[];for(;!pr.call(o,z);t.push(f.call(o,z)),z=g.call(o,z)){}return t;}});})();}if(!dojo._hasResource["dojox.lang.functional.reversed"]){dojo._hasResource["dojox.lang.functional.reversed"]=true;dojo.provide("dojox.lang.functional.reversed");(function(){var d=dojo,df=dojox.lang.functional;d.mixin(df,{filterRev:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var t=[],v,i=a.length-1;for(;i>=0;--i){v=a[i];if(f.call(o,v,i,a)){t.push(v);}}return t;},forEachRev:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);for(var i=a.length-1;i>=0;f.call(o,a[i],i,a),--i){}},mapRev:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var n=a.length,t=new Array(n),i=n-1,j=0;for(;i>=0;t[j++]=f.call(o,a[i],i,a),--i){}return t;},everyRev:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);for(var i=a.length-1;i>=0;--i){if(!f.call(o,a[i],i,a)){return false;}}return true;},someRev:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);for(var i=a.length-1;i>=0;--i){if(f.call(o,a[i],i,a)){return true;}}return false;}});})();}if(!dojo._hasResource["dojo.colors"]){dojo._hasResource["dojo.colors"]=true;dojo.provide("dojo.colors");(function(){var _159=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(_15a,obj){var m=_15a.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,obj);}return dojo.colorFromArray(c,obj);}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=[_159(m1,m2,H+1/3)*256,_159(m1,m2,H)*256,_159(m1,m2,H-1/3)*256,1];if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,obj);}}return null;};var _15b=function(c,low,high){c=Number(c);return isNaN(c)?high:c<low?low:c>high?high:c;};dojo.Color.prototype.sanitize=function(){var t=this;t.r=Math.round(_15b(t.r,0,255));t.g=Math.round(_15b(t.g,0,255));t.b=Math.round(_15b(t.b,0,255));t.a=_15b(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["dojox.color._base"]){dojo._hasResource["dojox.color._base"]=true;dojo.provide("dojox.color._base");dojox.color.Color=dojo.Color;dojox.color.blend=dojo.blendColors;dojox.color.fromRgb=dojo.colorFromRgb;dojox.color.fromHex=dojo.colorFromHex;dojox.color.fromArray=dojo.colorFromArray;dojox.color.fromString=dojo.colorFromString;dojox.color.greyscale=dojo.colors.makeGrey;dojo.mixin(dojox.color,{fromCmy:function(cyan,_15c,_15d){if(dojo.isArray(cyan)){_15c=cyan[1],_15d=cyan[2],cyan=cyan[0];}else{if(dojo.isObject(cyan)){_15c=cyan.m,_15d=cyan.y,cyan=cyan.c;}}cyan/=100,_15c/=100,_15d/=100;var r=1-cyan,g=1-_15c,b=1-_15d;return new dojox.color.Color({r:Math.round(r*255),g:Math.round(g*255),b:Math.round(b*255)});},fromCmyk:function(cyan,_15e,_15f,_160){if(dojo.isArray(cyan)){_15e=cyan[1],_15f=cyan[2],_160=cyan[3],cyan=cyan[0];}else{if(dojo.isObject(cyan)){_15e=cyan.m,_15f=cyan.y,_160=cyan.b,cyan=cyan.c;}}cyan/=100,_15e/=100,_15f/=100,_160/=100;var r,g,b;r=1-Math.min(1,cyan*(1-_160)+_160);g=1-Math.min(1,_15e*(1-_160)+_160);b=1-Math.min(1,_15f*(1-_160)+_160);return new dojox.color.Color({r:Math.round(r*255),g:Math.round(g*255),b:Math.round(b*255)});},fromHsl:function(hue,_161,_162){if(dojo.isArray(hue)){_161=hue[1],_162=hue[2],hue=hue[0];}else{if(dojo.isObject(hue)){_161=hue.s,_162=hue.l,hue=hue.h;}}_161/=100;_162/=100;while(hue<0){hue+=360;}while(hue>=360){hue-=360;}var r,g,b;if(hue<120){r=(120-hue)/60,g=hue/60,b=0;}else{if(hue<240){r=0,g=(240-hue)/60,b=(hue-120)/60;}else{r=(hue-240)/60,g=0,b=(360-hue)/60;}}r=2*_161*Math.min(r,1)+(1-_161);g=2*_161*Math.min(g,1)+(1-_161);b=2*_161*Math.min(b,1)+(1-_161);if(_162<0.5){r*=_162,g*=_162,b*=_162;}else{r=(1-_162)*r+2*_162-1;g=(1-_162)*g+2*_162-1;b=(1-_162)*b+2*_162-1;}return new dojox.color.Color({r:Math.round(r*255),g:Math.round(g*255),b:Math.round(b*255)});},fromHsv:function(hue,_163,_164){if(dojo.isArray(hue)){_163=hue[1],_164=hue[2],hue=hue[0];}else{if(dojo.isObject(hue)){_163=hue.s,_164=hue.v,hue=hue.h;}}if(hue==360){hue=0;}_163/=100;_164/=100;var r,g,b;if(_163==0){r=_164,b=_164,g=_164;}else{var _165=hue/60,i=Math.floor(_165),f=_165-i;var p=_164*(1-_163);var q=_164*(1-(_163*f));var t=_164*(1-(_163*(1-f)));switch(i){case 0:r=_164,g=t,b=p;break;case 1:r=q,g=_164,b=p;break;case 2:r=p,g=_164,b=t;break;case 3:r=p,g=q,b=_164;break;case 4:r=t,g=p,b=_164;break;case 5:r=_164,g=p,b=q;break;}}return new dojox.color.Color({r:Math.round(r*255),g:Math.round(g*255),b:Math.round(b*255)});}});dojo.extend(dojox.color.Color,{toCmy:function(){var cyan=1-(this.r/255),_166=1-(this.g/255),_167=1-(this.b/255);return {c:Math.round(cyan*100),m:Math.round(_166*100),y:Math.round(_167*100)};},toCmyk:function(){var cyan,_168,_169,_16a;var r=this.r/255,g=this.g/255,b=this.b/255;_16a=Math.min(1-r,1-g,1-b);cyan=(1-r-_16a)/(1-_16a);_168=(1-g-_16a)/(1-_16a);_169=(1-b-_16a)/(1-_16a);return {c:Math.round(cyan*100),m:Math.round(_168*100),y:Math.round(_169*100),b:Math.round(_16a*100)};},toHsl:function(){var r=this.r/255,g=this.g/255,b=this.b/255;var min=Math.min(r,b,g),max=Math.max(r,g,b);var _16b=max-min;var h=0,s=0,l=(min+max)/2;if(l>0&&l<1){s=_16b/((l<0.5)?(2*l):(2-2*l));}if(_16b>0){if(max==r&&max!=g){h+=(g-b)/_16b;}if(max==g&&max!=b){h+=(2+(b-r)/_16b);}if(max==b&&max!=r){h+=(4+(r-g)/_16b);}h*=60;}return {h:h,s:Math.round(s*100),l:Math.round(l*100)};},toHsv:function(){var r=this.r/255,g=this.g/255,b=this.b/255;var min=Math.min(r,b,g),max=Math.max(r,g,b);var _16c=max-min;var h=null,s=(max==0)?0:(_16c/max);if(s==0){h=0;}else{if(r==max){h=60*(g-b)/_16c;}else{if(g==max){h=120+60*(b-r)/_16c;}else{h=240+60*(r-g)/_16c;}}if(h<0){h+=360;}}return {h:h,s:Math.round(s*100),v:Math.round(max*100)};}});}if(!dojo._hasResource["dojox.color"]){dojo._hasResource["dojox.color"]=true;dojo.provide("dojox.color");}if(!dojo._hasResource["dojox.color.Palette"]){dojo._hasResource["dojox.color.Palette"]=true;dojo.provide("dojox.color.Palette");(function(){var dxc=dojox.color;dxc.Palette=function(base){this.colors=[];if(base instanceof dojox.color.Palette){this.colors=base.colors.slice(0);}else{if(base instanceof dojox.color.Color){this.colors=[null,null,base,null,null];}else{if(dojo.isArray(base)){this.colors=dojo.map(base.slice(0),function(item){if(dojo.isString(item)){return new dojox.color.Color(item);}return item;});}else{if(dojo.isString(base)){this.colors=[null,null,new dojox.color.Color(base),null,null];}}}}};function _16d(p,_16e,val){var ret=new dojox.color.Palette();ret.colors=[];dojo.forEach(p.colors,function(item){var r=(_16e=="dr")?item.r+val:item.r,g=(_16e=="dg")?item.g+val:item.g,b=(_16e=="db")?item.b+val:item.b,a=(_16e=="da")?item.a+val:item.a;ret.colors.push(new dojox.color.Color({r:Math.min(255,Math.max(0,r)),g:Math.min(255,Math.max(0,g)),b:Math.min(255,Math.max(0,b)),a:Math.min(1,Math.max(0,a))}));});return ret;};function tCMY(p,_16f,val){var ret=new dojox.color.Palette();ret.colors=[];dojo.forEach(p.colors,function(item){var o=item.toCmy(),c=(_16f=="dc")?o.c+val:o.c,m=(_16f=="dm")?o.m+val:o.m,y=(_16f=="dy")?o.y+val:o.y;ret.colors.push(dojox.color.fromCmy(Math.min(100,Math.max(0,c)),Math.min(100,Math.max(0,m)),Math.min(100,Math.max(0,y))));});return ret;};function _170(p,_171,val){var ret=new dojox.color.Palette();ret.colors=[];dojo.forEach(p.colors,function(item){var o=item.toCmyk(),c=(_171=="dc")?o.c+val:o.c,m=(_171=="dm")?o.m+val:o.m,y=(_171=="dy")?o.y+val:o.y,k=(_171=="dk")?o.b+val:o.b;ret.colors.push(dojox.color.fromCmyk(Math.min(100,Math.max(0,c)),Math.min(100,Math.max(0,m)),Math.min(100,Math.max(0,y)),Math.min(100,Math.max(0,k))));});return ret;};function tHSL(p,_172,val){var ret=new dojox.color.Palette();ret.colors=[];dojo.forEach(p.colors,function(item){var o=item.toHsl(),h=(_172=="dh")?o.h+val:o.h,s=(_172=="ds")?o.s+val:o.s,l=(_172=="dl")?o.l+val:o.l;ret.colors.push(dojox.color.fromHsl(h%360,Math.min(100,Math.max(0,s)),Math.min(100,Math.max(0,l))));});return ret;};function tHSV(p,_173,val){var ret=new dojox.color.Palette();ret.colors=[];dojo.forEach(p.colors,function(item){var o=item.toHsv(),h=(_173=="dh")?o.h+val:o.h,s=(_173=="ds")?o.s+val:o.s,v=(_173=="dv")?o.v+val:o.v;ret.colors.push(dojox.color.fromHsv(h%360,Math.min(100,Math.max(0,s)),Math.min(100,Math.max(0,v))));});return ret;};function _174(val,low,high){return high-((high-val)*((high-low)/high));};dojo.extend(dxc.Palette,{transform:function(_175){var fn=_16d;if(_175.use){var use=_175.use.toLowerCase();if(use.indexOf("hs")==0){if(use.charAt(2)=="l"){fn=tHSL;}else{fn=tHSV;}}else{if(use.indexOf("cmy")==0){if(use.charAt(3)=="k"){fn=_170;}else{fn=tCMY;}}}}else{if("dc" in _175||"dm" in _175||"dy" in _175){if("dk" in _175){fn=_170;}else{fn=tCMY;}}else{if("dh" in _175||"ds" in _175){if("dv" in _175){fn=tHSV;}else{fn=tHSL;}}}}var _176=this;for(var p in _175){if(p=="use"){continue;}_176=fn(_176,p,_175[p]);}return _176;},clone:function(){return new dxc.Palette(this);}});dojo.mixin(dxc.Palette,{generators:{analogous:function(args){var high=args.high||60,low=args.low||18,base=dojo.isString(args.base)?new dojox.color.Color(args.base):args.base,hsv=base.toHsv();var h=[(hsv.h+low+360)%360,(hsv.h+Math.round(low/2)+360)%360,hsv.h,(hsv.h-Math.round(high/2)+360)%360,(hsv.h-high+360)%360];var s1=Math.max(10,(hsv.s<=95)?hsv.s+5:(100-(hsv.s-95))),s2=(hsv.s>1)?hsv.s-1:21-hsv.s,v1=(hsv.v>=92)?hsv.v-9:Math.max(hsv.v+9,20),v2=(hsv.v<=90)?Math.max(hsv.v+5,20):(95+Math.ceil((hsv.v-90)/2)),s=[s1,s2,hsv.s,s1,s1],v=[v1,v2,hsv.v,v1,v2];return new dxc.Palette(dojo.map(h,function(hue,i){return dojox.color.fromHsv(hue,s[i],v[i]);}));},monochromatic:function(args){var base=dojo.isString(args.base)?new dojox.color.Color(args.base):args.base,hsv=base.toHsv();var s1=(hsv.s-30>9)?hsv.s-30:hsv.s+30,s2=hsv.s,v1=_174(hsv.v,20,100),v2=(hsv.v-20>20)?hsv.v-20:hsv.v+60,v3=(hsv.v-50>20)?hsv.v-50:hsv.v+30;return new dxc.Palette([dojox.color.fromHsv(hsv.h,s1,v1),dojox.color.fromHsv(hsv.h,s2,v3),base,dojox.color.fromHsv(hsv.h,s1,v3),dojox.color.fromHsv(hsv.h,s2,v2)]);},triadic:function(args){var base=dojo.isString(args.base)?new dojox.color.Color(args.base):args.base,hsv=base.toHsv();var h1=(hsv.h+57+360)%360,h2=(hsv.h-157+360)%360,s1=(hsv.s>20)?hsv.s-10:hsv.s+10,s2=(hsv.s>90)?hsv.s-10:hsv.s+10,s3=(hsv.s>95)?hsv.s-5:hsv.s+5,v1=(hsv.v-20>20)?hsv.v-20:hsv.v+20,v2=(hsv.v-30>20)?hsv.v-30:hsv.v+30,v3=(hsv.v-30>70)?hsv.v-30:hsv.v+30;return new dxc.Palette([dojox.color.fromHsv(h1,s1,hsv.v),dojox.color.fromHsv(hsv.h,s2,v2),base,dojox.color.fromHsv(h2,s2,v1),dojox.color.fromHsv(h2,s3,v3)]);},complementary:function(args){var base=dojo.isString(args.base)?new dojox.color.Color(args.base):args.base,hsv=base.toHsv();var h1=((hsv.h*2)+137<360)?(hsv.h*2)+137:Math.floor(hsv.h/2)-137,s1=Math.max(hsv.s-10,0),s2=_174(hsv.s,10,100),s3=Math.min(100,hsv.s+20),v1=Math.min(100,hsv.v+30),v2=(hsv.v>20)?hsv.v-30:hsv.v+30;return new dxc.Palette([dojox.color.fromHsv(hsv.h,s1,v1),dojox.color.fromHsv(hsv.h,s2,v2),base,dojox.color.fromHsv(h1,s3,v2),dojox.color.fromHsv(h1,hsv.s,hsv.v)]);},splitComplementary:function(args){var base=dojo.isString(args.base)?new dojox.color.Color(args.base):args.base,_177=args.da||30,hsv=base.toHsv();var _178=((hsv.h*2)+137<360)?(hsv.h*2)+137:Math.floor(hsv.h/2)-137,h1=(_178-_177+360)%360,h2=(_178+_177)%360,s1=Math.max(hsv.s-10,0),s2=_174(hsv.s,10,100),s3=Math.min(100,hsv.s+20),v1=Math.min(100,hsv.v+30),v2=(hsv.v>20)?hsv.v-30:hsv.v+30;return new dxc.Palette([dojox.color.fromHsv(h1,s1,v1),dojox.color.fromHsv(h1,s2,v2),base,dojox.color.fromHsv(h2,s3,v2),dojox.color.fromHsv(h2,hsv.s,hsv.v)]);},compound:function(args){var base=dojo.isString(args.base)?new dojox.color.Color(args.base):args.base,hsv=base.toHsv();var h1=((hsv.h*2)+18<360)?(hsv.h*2)+18:Math.floor(hsv.h/2)-18,h2=((hsv.h*2)+120<360)?(hsv.h*2)+120:Math.floor(hsv.h/2)-120,h3=((hsv.h*2)+99<360)?(hsv.h*2)+99:Math.floor(hsv.h/2)-99,s1=(hsv.s-40>10)?hsv.s-40:hsv.s+40,s2=(hsv.s-10>80)?hsv.s-10:hsv.s+10,s3=(hsv.s-25>10)?hsv.s-25:hsv.s+25,v1=(hsv.v-40>10)?hsv.v-40:hsv.v+40,v2=(hsv.v-20>80)?hsv.v-20:hsv.v+20,v3=Math.max(hsv.v,20);return new dxc.Palette([dojox.color.fromHsv(h1,s1,v1),dojox.color.fromHsv(h1,s2,v2),base,dojox.color.fromHsv(h2,s3,v3),dojox.color.fromHsv(h3,s2,v2)]);},shades:function(args){var base=dojo.isString(args.base)?new dojox.color.Color(args.base):args.base,hsv=base.toHsv();var s=(hsv.s==100&&hsv.v==0)?0:hsv.s,v1=(hsv.v-50>20)?hsv.v-50:hsv.v+30,v2=(hsv.v-25>=20)?hsv.v-25:hsv.v+55,v3=(hsv.v-75>=20)?hsv.v-75:hsv.v+5,v4=Math.max(hsv.v-10,20);return new dxc.Palette([new dojox.color.fromHsv(hsv.h,s,v1),new dojox.color.fromHsv(hsv.h,s,v2),base,new dojox.color.fromHsv(hsv.h,s,v3),new dojox.color.fromHsv(hsv.h,s,v4)]);}},generate:function(base,type){if(dojo.isFunction(type)){return type({base:base});}else{if(dxc.Palette.generators[type]){return dxc.Palette.generators[type]({base:base});}}throw new Error("dojox.color.Palette.generate: the specified generator ('"+type+"') does not exist.");}});})();}if(!dojo._hasResource["dojox.charting.Theme"]){dojo._hasResource["dojox.charting.Theme"]=true;dojo.provide("dojox.charting.Theme");(function(){var dxc=dojox.charting;dxc.Theme=function(_179){_179=_179||{};var def=dxc.Theme._def;dojo.forEach(["chart","plotarea","axis","series","marker"],function(n){this[n]=dojo.delegate(def[n],_179[n]||{});},this);this.markers=dojo.delegate(dxc.Theme.Markers,_179.markers||{});this.colors=[];this.antiAlias=("antiAlias" in _179)?_179.antiAlias:true;this.assignColors=("assignColors" in _179)?_179.assignColors:true;this.assignMarkers=("assignMarkers" in _179)?_179.assignMarkers:true;_179.colors=_179.colors||def.colors;dojo.forEach(_179.colors,function(item){this.colors.push(item);},this);this._current={color:0,marker:0};this._markers=[];this._buildMarkerArray();};dxc.Theme.Markers={CIRCLE:"m-3,0 c0,-4 6,-4 6,0 m-6,0 c0,4 6,4 6,0",SQUARE:"m-3,-3 l0,6 6,0 0,-6 z",DIAMOND:"m0,-3 l3,3 -3,3 -3,-3 z",CROSS:"m0,-3 l0,6 m-3,-3 l6,0",X:"m-3,-3 l6,6 m0,-6 l-6,6",TRIANGLE:"m-3,3 l3,-6 3,6 z",TRIANGLE_INVERTED:"m-3,-3 l3,6 3,-6 z"};dxc.Theme._def={chart:{stroke:null,fill:"white"},plotarea:{stroke:null,fill:"white"},axis:{stroke:{color:"#333",width:1},majorTick:{color:"#666",width:1,length:6,position:"center"},minorTick:{color:"#666",width:0.8,length:3,position:"center"},microTick:{color:"#666",width:0.5,length:1,position:"center"},font:"normal normal normal 7pt Tahoma",fontColor:"#333"},series:{outline:{width:0.1,color:"#ccc"},stroke:{width:1.5,color:"#333"},fill:"#ccc",font:"normal normal normal 7pt Tahoma",fontColor:"#000"},marker:{stroke:{width:1},fill:"#333",font:"normal normal normal 7pt Tahoma",fontColor:"#000"},colors:["#54544c","#858e94","#6e767a","#948585","#474747"]};dojo.extend(dxc.Theme,{defineColors:function(obj){var _17a=obj||{};var c=[],n=_17a.num||5;if(_17a.colors){var l=_17a.colors.length;for(var i=0;i<n;i++){c.push(_17a.colors[i%l]);}this.colors=c;}else{if(_17a.hue){var s=_17a.saturation||100;var st=_17a.low||30;var end=_17a.high||90;var l=(end+st)/2;this.colors=dojox.color.Palette.generate(dojox.color.fromHsv(_17a.hue,s,l),"monochromatic").colors;}else{if(_17a.generator){this.colors=dojox.color.Palette.generate(_17a.base,_17a.generator).colors;}}}},_buildMarkerArray:function(){this._markers=[];for(var p in this.markers){this._markers.push(this.markers[p]);}this._current.marker=0;},_clone:function(){return new dxc.Theme({chart:this.chart,plotarea:this.plotarea,axis:this.axis,series:this.series,marker:this.marker,antiAlias:this.antiAlias,assignColors:this.assignColors,assignMarkers:this.assigneMarkers,colors:dojo.delegate(this.colors)});},addMarker:function(name,_17b){this.markers[name]=_17b;this._buildMarkerArray();},setMarkers:function(obj){this.markers=obj;this._buildMarkerArray();},next:function(type){if(type=="marker"){return this._markers[this._current.marker++%this._markers.length];}else{return this.colors[this._current.color++%this.colors.length];}},clear:function(){this._current={color:0,marker:0};}});})();}if(!dojo._hasResource["dojox.charting.Element"]){dojo._hasResource["dojox.charting.Element"]=true;dojo.provide("dojox.charting.Element");dojo.declare("dojox.charting.Element",null,{constructor:function(_17c){this.chart=_17c;this.group=null;this.htmlElements=[];this.dirty=true;},createGroup:function(_17d){if(!_17d){_17d=this.chart.surface;}if(!this.group){this.group=_17d.createGroup();}return this;},purgeGroup:function(){this.destroyHtmlElements();if(this.group){this.group.clear();this.group.removeShape();this.group=null;}this.dirty=true;return this;},cleanGroup:function(_17e){this.destroyHtmlElements();if(!_17e){_17e=this.chart.surface;}if(this.group){this.group.clear();}else{this.group=_17e.createGroup();}this.dirty=true;return this;},destroyHtmlElements:function(){if(this.htmlElements.length){dojo.forEach(this.htmlElements,dojo.destroy);this.htmlElements=[];}},destroy:function(){this.purgeGroup();}});}if(!dojo._hasResource["dojox.charting.Series"]){dojo._hasResource["dojox.charting.Series"]=true;dojo.provide("dojox.charting.Series");dojo.declare("dojox.charting.Series",dojox.charting.Element,{constructor:function(_17f,data,_180){dojo.mixin(this,_180);if(typeof this.plot!="string"){this.plot="default";}this.data=data;this.dirty=true;this.clear();},clear:function(){this.dyn={};}});}if(!dojo._hasResource["dojox.charting.scaler.common"]){dojo._hasResource["dojox.charting.scaler.common"]=true;dojo.provide("dojox.charting.scaler.common");(function(){var eq=function(a,b){return Math.abs(a-b)<=0.000001*(Math.abs(a)+Math.abs(b));};dojo.mixin(dojox.charting.scaler.common,{findString:function(val,text){val=val.toLowerCase();for(var i=0;i<text.length;++i){if(val==text[i]){return true;}}return false;},getNumericLabel:function(_181,_182,_183){var def=_183.fixed?_181.toFixed(_182<0?-_182:0):_181.toString();if(_183.labelFunc){var r=_183.labelFunc(def,_181,_182);if(r){return r;}}if(_183.labels){var l=_183.labels,lo=0,hi=l.length;while(lo<hi){var mid=Math.floor((lo+hi)/2),val=l[mid].value;if(val<_181){lo=mid+1;}else{hi=mid;}}if(lo<l.length&&eq(l[lo].value,_181)){return l[lo].text;}--lo;if(lo>=0&&lo<l.length&&eq(l[lo].value,_181)){return l[lo].text;}lo+=2;if(lo<l.length&&eq(l[lo].value,_181)){return l[lo].text;}}return def;}});})();}if(!dojo._hasResource["dojox.charting.scaler.linear"]){dojo._hasResource["dojox.charting.scaler.linear"]=true;dojo.provide("dojox.charting.scaler.linear");(function(){var _184=3,dc=dojox.charting,dcs=dc.scaler,dcsc=dcs.common,_185=dcsc.findString,_186=dcsc.getNumericLabel;var _187=function(min,max,_188,_189,_18a,_18b,span){_188=dojo.delegate(_188);if(!_189){if(_188.fixUpper=="major"){_188.fixUpper="minor";}if(_188.fixLower=="major"){_188.fixLower="minor";}}if(!_18a){if(_188.fixUpper=="minor"){_188.fixUpper="micro";}if(_188.fixLower=="minor"){_188.fixLower="micro";}}if(!_18b){if(_188.fixUpper=="micro"){_188.fixUpper="none";}if(_188.fixLower=="micro"){_188.fixLower="none";}}var _18c=_185(_188.fixLower,["major"])?Math.floor(_188.min/_189)*_189:_185(_188.fixLower,["minor"])?Math.floor(_188.min/_18a)*_18a:_185(_188.fixLower,["micro"])?Math.floor(_188.min/_18b)*_18b:_188.min,_18d=_185(_188.fixUpper,["major"])?Math.ceil(_188.max/_189)*_189:_185(_188.fixUpper,["minor"])?Math.ceil(_188.max/_18a)*_18a:_185(_188.fixUpper,["micro"])?Math.ceil(_188.max/_18b)*_18b:_188.max;if(_188.useMin){min=_18c;}if(_188.useMax){max=_18d;}var _18e=(!_189||_188.useMin&&_185(_188.fixLower,["major"]))?min:Math.ceil(min/_189)*_189,_18f=(!_18a||_188.useMin&&_185(_188.fixLower,["major","minor"]))?min:Math.ceil(min/_18a)*_18a,_190=(!_18b||_188.useMin&&_185(_188.fixLower,["major","minor","micro"]))?min:Math.ceil(min/_18b)*_18b,_191=!_189?0:(_188.useMax&&_185(_188.fixUpper,["major"])?Math.round((max-_18e)/_189):Math.floor((max-_18e)/_189))+1,_192=!_18a?0:(_188.useMax&&_185(_188.fixUpper,["major","minor"])?Math.round((max-_18f)/_18a):Math.floor((max-_18f)/_18a))+1,_193=!_18b?0:(_188.useMax&&_185(_188.fixUpper,["major","minor","micro"])?Math.round((max-_190)/_18b):Math.floor((max-_190)/_18b))+1,_194=_18a?Math.round(_189/_18a):0,_195=_18b?Math.round(_18a/_18b):0,_196=_189?Math.floor(Math.log(_189)/Math.LN10):0,_197=_18a?Math.floor(Math.log(_18a)/Math.LN10):0,_198=span/(max-min);if(!isFinite(_198)){_198=1;}return {bounds:{lower:_18c,upper:_18d,from:min,to:max,scale:_198,span:span},major:{tick:_189,start:_18e,count:_191,prec:_196},minor:{tick:_18a,start:_18f,count:_192,prec:_197},micro:{tick:_18b,start:_190,count:_193,prec:0},minorPerMajor:_194,microPerMinor:_195,scaler:dcs.linear};};dojo.mixin(dojox.charting.scaler.linear,{buildScaler:function(min,max,span,_199){var h={fixUpper:"none",fixLower:"none",natural:false};if(_199){if("fixUpper" in _199){h.fixUpper=String(_199.fixUpper);}if("fixLower" in _199){h.fixLower=String(_199.fixLower);}if("natural" in _199){h.natural=Boolean(_199.natural);}}if("min" in _199){min=_199.min;}if("max" in _199){max=_199.max;}if(_199.includeZero){if(min>0){min=0;}if(max<0){max=0;}}h.min=min;h.useMin=true;h.max=max;h.useMax=true;if("from" in _199){min=_199.from;h.useMin=false;}if("to" in _199){max=_199.to;h.useMax=false;}if(max<=min){return _187(min,max,h,0,0,0,span);}var mag=Math.floor(Math.log(max-min)/Math.LN10),_19a=_199&&("majorTickStep" in _199)?_199.majorTickStep:Math.pow(10,mag),_19b=0,_19c=0,_19d;if(_199&&("minorTickStep" in _199)){_19b=_199.minorTickStep;}else{do{_19b=_19a/10;if(!h.natural||_19b>0.9){_19d=_187(min,max,h,_19a,_19b,0,span);if(_19d.bounds.scale*_19d.minor.tick>_184){break;}}_19b=_19a/5;if(!h.natural||_19b>0.9){_19d=_187(min,max,h,_19a,_19b,0,span);if(_19d.bounds.scale*_19d.minor.tick>_184){break;}}_19b=_19a/2;if(!h.natural||_19b>0.9){_19d=_187(min,max,h,_19a,_19b,0,span);if(_19d.bounds.scale*_19d.minor.tick>_184){break;}}return _187(min,max,h,_19a,0,0,span);}while(false);}if(_199&&("microTickStep" in _199)){_19c=_199.microTickStep;_19d=_187(min,max,h,_19a,_19b,_19c,span);}else{do{_19c=_19b/10;if(!h.natural||_19c>0.9){_19d=_187(min,max,h,_19a,_19b,_19c,span);if(_19d.bounds.scale*_19d.micro.tick>_184){break;}}_19c=_19b/5;if(!h.natural||_19c>0.9){_19d=_187(min,max,h,_19a,_19b,_19c,span);if(_19d.bounds.scale*_19d.micro.tick>_184){break;}}_19c=_19b/2;if(!h.natural||_19c>0.9){_19d=_187(min,max,h,_19a,_19b,_19c,span);if(_19d.bounds.scale*_19d.micro.tick>_184){break;}}_19c=0;}while(false);}return _19c?_19d:_187(min,max,h,_19a,_19b,0,span);},buildTicks:function(_19e,_19f){var step,next,tick,_1a0=_19e.major.start,_1a1=_19e.minor.start,_1a2=_19e.micro.start;if(_19f.microTicks&&_19e.micro.tick){step=_19e.micro.tick,next=_1a2;}else{if(_19f.minorTicks&&_19e.minor.tick){step=_19e.minor.tick,next=_1a1;}else{if(_19e.major.tick){step=_19e.major.tick,next=_1a0;}else{return null;}}}var _1a3=1/_19e.bounds.scale;if(_19e.bounds.to<=_19e.bounds.from||isNaN(_1a3)||!isFinite(_1a3)||step<=0||isNaN(step)||!isFinite(step)){return null;}var _1a4=[],_1a5=[],_1a6=[];while(next<=_19e.bounds.to+_1a3){if(Math.abs(_1a0-next)<step/2){tick={value:_1a0};if(_19f.majorLabels){tick.label=_186(_1a0,_19e.major.prec,_19f);}_1a4.push(tick);_1a0+=_19e.major.tick;_1a1+=_19e.minor.tick;_1a2+=_19e.micro.tick;}else{if(Math.abs(_1a1-next)<step/2){if(_19f.minorTicks){tick={value:_1a1};if(_19f.minorLabels&&(_19e.minMinorStep<=_19e.minor.tick*_19e.bounds.scale)){tick.label=_186(_1a1,_19e.minor.prec,_19f);}_1a5.push(tick);}_1a1+=_19e.minor.tick;_1a2+=_19e.micro.tick;}else{if(_19f.microTicks){_1a6.push({value:_1a2});}_1a2+=_19e.micro.tick;}}next+=step;}return {major:_1a4,minor:_1a5,micro:_1a6};},getTransformerFromModel:function(_1a7){var _1a8=_1a7.bounds.from,_1a9=_1a7.bounds.scale;return function(x){return (x-_1a8)*_1a9;};},getTransformerFromPlot:function(_1aa){var _1ab=_1aa.bounds.from,_1ac=_1aa.bounds.scale;return function(x){return x/_1ac+_1ab;};}});})();}if(!dojo._hasResource["dojox.charting.axis2d.common"]){dojo._hasResource["dojox.charting.axis2d.common"]=true;dojo.provide("dojox.charting.axis2d.common");(function(){var g=dojox.gfx;var _1ad=function(s){s.marginLeft="0px";s.marginTop="0px";s.marginRight="0px";s.marginBottom="0px";s.paddingLeft="0px";s.paddingTop="0px";s.paddingRight="0px";s.paddingBottom="0px";s.borderLeftWidth="0px";s.borderTopWidth="0px";s.borderRightWidth="0px";s.borderBottomWidth="0px";};var _1ae=function(n){if(n["getBoundingClientRect"]){var bcr=n.getBoundingClientRect();return bcr.width||(bcr.right-bcr.left);}else{return dojo.marginBox(n).w;}};dojo.mixin(dojox.charting.axis2d.common,{createText:{gfx:function(_1af,_1b0,x,y,_1b1,text,font,_1b2){return _1b0.createText({x:x,y:y,text:text,align:_1b1}).setFont(font).setFill(_1b2);},html:function(_1b3,_1b4,x,y,_1b5,text,font,_1b6,_1b7){var p=dojo.doc.createElement("div"),s=p.style,_1b8;_1ad(s);s.font=font;p.innerHTML=String(text).replace(/\s/g,"&nbsp;");s.color=_1b6;s.position="absolute";s.left="-10000px";dojo.body().appendChild(p);var size=g.normalizedLength(g.splitFontString(font).size);if(!_1b7){_1b8=_1ae(p);}dojo.body().removeChild(p);s.position="relative";if(_1b7){s.width=_1b7+"px";switch(_1b5){case "middle":s.textAlign="center";s.left=(x-_1b7/2)+"px";break;case "end":s.textAlign="right";s.left=(x-_1b7)+"px";break;default:s.left=x+"px";s.textAlign="left";break;}}else{switch(_1b5){case "middle":s.left=Math.floor(x-_1b8/2)+"px";break;case "end":s.left=Math.floor(x-_1b8)+"px";break;default:s.left=Math.floor(x)+"px";break;}}s.top=Math.floor(y-size)+"px";var wrap=dojo.doc.createElement("div"),w=wrap.style;_1ad(w);w.width="0px";w.height="0px";wrap.appendChild(p);_1b3.node.insertBefore(wrap,_1b3.node.firstChild);return wrap;}}});})();}if(!dojo._hasResource["dojox.charting.axis2d.Base"]){dojo._hasResource["dojox.charting.axis2d.Base"]=true;dojo.provide("dojox.charting.axis2d.Base");dojo.declare("dojox.charting.axis2d.Base",dojox.charting.Element,{constructor:function(_1b9,_1ba){this.vertical=_1ba&&_1ba.vertical;},clear:function(){return this;},initialized:function(){return false;},calculate:function(min,max,span){return this;},getScaler:function(){return null;},getTicks:function(){return null;},getOffsets:function(){return {l:0,r:0,t:0,b:0};},render:function(dim,_1bb){return this;}});}if(!dojo._hasResource["dojo.string"]){dojo._hasResource["dojo.string"]=true;dojo.provide("dojo.string");dojo.string.rep=function(str,num){if(num<=0||!str){return "";}var buf=[];for(;;){if(num&1){buf.push(str);}if(!(num>>=1)){break;}str+=str;}return buf.join("");};dojo.string.pad=function(text,size,ch,end){if(!ch){ch="0";}var out=String(text),pad=dojo.string.rep(ch,Math.ceil((size-out.length)/ch.length));return end?out+pad:pad+out;};dojo.string.substitute=function(_1bc,map,_1bd,_1be){_1be=_1be||dojo.global;_1bd=_1bd?dojo.hitch(_1be,_1bd):function(v){return v;};return _1bc.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_1bf,key,_1c0){var _1c1=dojo.getObject(key,false,map);if(_1c0){_1c1=dojo.getObject(_1c0,false,_1be).call(_1be,_1c1,key);}return _1bd(_1c1,key).toString();});};dojo.string.trim=String.prototype.trim?dojo.trim:function(str){str=str.replace(/^\s+/,"");for(var i=str.length-1;i>=0;i--){if(/\S/.test(str.charAt(i))){str=str.substring(0,i+1);break;}}return str;};}if(!dojo._hasResource["dojox.lang.utils"]){dojo._hasResource["dojox.lang.utils"]=true;dojo.provide("dojox.lang.utils");(function(){var _1c2={},du=dojox.lang.utils;var _1c3=function(o){if(dojo.isArray(o)){return dojo._toArray(o);}if(!dojo.isObject(o)||dojo.isFunction(o)){return o;}return dojo.delegate(o);};dojo.mixin(du,{coerceType:function(_1c4,_1c5){switch(typeof _1c4){case "number":return Number(eval("("+_1c5+")"));case "string":return String(_1c5);case "boolean":return Boolean(eval("("+_1c5+")"));}return eval("("+_1c5+")");},updateWithObject:function(_1c6,_1c7,conv){if(!_1c7){return _1c6;}for(var x in _1c6){if(x in _1c7&&!(x in _1c2)){var t=_1c6[x];if(t&&typeof t=="object"){du.updateWithObject(t,_1c7[x],conv);}else{_1c6[x]=conv?du.coerceType(t,_1c7[x]):_1c3(_1c7[x]);}}}return _1c6;},updateWithPattern:function(_1c8,_1c9,_1ca,conv){if(!_1c9||!_1ca){return _1c8;}for(var x in _1ca){if(x in _1c9&&!(x in _1c2)){_1c8[x]=conv?du.coerceType(_1ca[x],_1c9[x]):_1c3(_1c9[x]);}}return _1c8;}});})();}if(!dojo._hasResource["dojox.charting.axis2d.Default"]){dojo._hasResource["dojox.charting.axis2d.Default"]=true;dojo.provide("dojox.charting.axis2d.Default");(function(){var dc=dojox.charting,df=dojox.lang.functional,du=dojox.lang.utils,g=dojox.gfx,lin=dc.scaler.linear,_1cb=4;dojo.declare("dojox.charting.axis2d.Default",dojox.charting.axis2d.Base,{defaultParams:{vertical:false,fixUpper:"none",fixLower:"none",natural:false,leftBottom:true,includeZero:false,fixed:true,majorLabels:true,minorTicks:true,minorLabels:true,microTicks:false,htmlLabels:true},optionalParams:{min:0,max:1,from:0,to:1,majorTickStep:4,minorTickStep:2,microTickStep:1,labels:[],labelFunc:null,maxLabelSize:0,stroke:{},majorTick:{},minorTick:{},microTick:{},font:"",fontColor:""},constructor:function(_1cc,_1cd){this.opt=dojo.delegate(this.defaultParams,_1cd);du.updateWithPattern(this.opt,_1cd,this.optionalParams);},dependOnData:function(){return !("min" in this.opt)||!("max" in this.opt);},clear:function(){delete this.scaler;delete this.ticks;this.dirty=true;return this;},initialized:function(){return "scaler" in this&&!(this.dirty&&this.dependOnData());},setWindow:function(_1ce,_1cf){this.scale=_1ce;this.offset=_1cf;return this.clear();},getWindowScale:function(){return "scale" in this?this.scale:1;},getWindowOffset:function(){return "offset" in this?this.offset:0;},_groupLabelWidth:function(_1d0,font){if(_1d0[0]["text"]){_1d0=df.map(_1d0,function(_1d1){return _1d1.text;});}var s=_1d0.join("<br>");return dojox.gfx._base._getTextBox(s,{font:font}).w||0;},calculate:function(min,max,span,_1d2){if(this.initialized()){return this;}var o=this.opt;this.labels="labels" in o?o.labels:_1d2;this.scaler=lin.buildScaler(min,max,span,o);var tsb=this.scaler.bounds;if("scale" in this){o.from=tsb.lower+this.offset;o.to=(tsb.upper-tsb.lower)/this.scale+o.from;if(!isFinite(o.from)||isNaN(o.from)||!isFinite(o.to)||isNaN(o.to)||o.to-o.from>=tsb.upper-tsb.lower){delete o.from;delete o.to;delete this.scale;delete this.offset;}else{if(o.from<tsb.lower){o.to+=tsb.lower-o.from;o.from=tsb.lower;}else{if(o.to>tsb.upper){o.from+=tsb.upper-o.to;o.to=tsb.upper;}}this.offset=o.from-tsb.lower;}this.scaler=lin.buildScaler(min,max,span,o);tsb=this.scaler.bounds;if(this.scale==1&&this.offset==0){delete this.scale;delete this.offset;}}var _1d3=0,ta=this.chart.theme.axis,_1d4="font" in o?o.font:ta.font,size=_1d4?g.normalizedLength(g.splitFontString(_1d4).size):0;if(this.vertical){if(size){_1d3=size+_1cb;}}else{if(size){var _1d5,i;if(o.labelFunc&&o.maxLabelSize){_1d5=o.maxLabelSize;}else{if(this.labels){_1d5=this._groupLabelWidth(this.labels,_1d4);}else{var _1d6=Math.ceil(Math.log(Math.max(Math.abs(tsb.from),Math.abs(tsb.to)))/Math.LN10),t=[];if(tsb.from<0||tsb.to<0){t.push("-");}t.push(dojo.string.rep("9",_1d6));var _1d7=Math.floor(Math.log(tsb.to-tsb.from)/Math.LN10);if(_1d7>0){t.push(".");for(i=0;i<_1d7;++i){t.push("9");}}_1d5=dojox.gfx._base._getTextBox(t.join(""),{font:_1d4}).w;}}_1d3=_1d5+_1cb;}}this.scaler.minMinorStep=_1d3;this.ticks=lin.buildTicks(this.scaler,o);return this;},getScaler:function(){return this.scaler;},getTicks:function(){return this.ticks;},getOffsets:function(){var o=this.opt;var _1d8={l:0,r:0,t:0,b:0},_1d9,a,b,c,d,gl=dc.scaler.common.getNumericLabel,_1da=0,ta=this.chart.theme.axis,_1db="font" in o?o.font:ta.font,_1dc="majorTick" in o?o.majorTick:ta.majorTick,_1dd="minorTick" in o?o.minorTick:ta.minorTick,size=_1db?g.normalizedLength(g.splitFontString(_1db).size):0,s=this.scaler;if(!s){return _1d8;}var ma=s.major,mi=s.minor;if(this.vertical){if(size){if(o.labelFunc&&o.maxLabelSize){_1d9=o.maxLabelSize;}else{if(this.labels){_1d9=this._groupLabelWidth(this.labels,_1db);}else{_1d9=this._groupLabelWidth([gl(ma.start,ma.prec,o),gl(ma.start+ma.count*ma.tick,ma.prec,o),gl(mi.start,mi.prec,o),gl(mi.start+mi.count*mi.tick,mi.prec,o)],_1db);}}_1da=_1d9+_1cb;}_1da+=_1cb+Math.max(_1dc.length,_1dd.length);_1d8[o.leftBottom?"l":"r"]=_1da;_1d8.t=_1d8.b=size/2;}else{if(size){_1da=size+_1cb;}_1da+=_1cb+Math.max(_1dc.length,_1dd.length);_1d8[o.leftBottom?"b":"t"]=_1da;if(size){if(o.labelFunc&&o.maxLabelSize){_1d9=o.maxLabelSize;}else{if(this.labels){_1d9=this._groupLabelWidth(this.labels,_1db);}else{_1d9=this._groupLabelWidth([gl(ma.start,ma.prec,o),gl(ma.start+ma.count*ma.tick,ma.prec,o),gl(mi.start,mi.prec,o),gl(mi.start+mi.count*mi.tick,mi.prec,o)],_1db);}}_1d8.l=_1d8.r=_1d9/2;}}if(_1d9){this._cachedLabelWidth=_1d9;}return _1d8;},render:function(dim,_1de){if(!this.dirty){return this;}var o=this.opt;var _1df,stop,_1e0,_1e1,_1e2,_1e3,ta=this.chart.theme.axis,_1e4="stroke" in o?o.stroke:ta.stroke,_1e5="majorTick" in o?o.majorTick:ta.majorTick,_1e6="minorTick" in o?o.minorTick:ta.minorTick,_1e7="microTick" in o?o.microTick:ta.minorTick,_1e8="font" in o?o.font:ta.font,_1e9="fontColor" in o?o.fontColor:ta.fontColor,_1ea=Math.max(_1e5.length,_1e6.length),size=_1e8?g.normalizedLength(g.splitFontString(_1e8).size):0;if(this.vertical){_1df={y:dim.height-_1de.b};stop={y:_1de.t};_1e0={x:0,y:-1};if(o.leftBottom){_1df.x=stop.x=_1de.l;_1e1={x:-1,y:0};_1e3="end";}else{_1df.x=stop.x=dim.width-_1de.r;_1e1={x:1,y:0};_1e3="start";}_1e2={x:_1e1.x*(_1ea+_1cb),y:size*0.4};}else{_1df={x:_1de.l};stop={x:dim.width-_1de.r};_1e0={x:1,y:0};_1e3="middle";if(o.leftBottom){_1df.y=stop.y=dim.height-_1de.b;_1e1={x:0,y:1};_1e2={y:_1ea+_1cb+size};}else{_1df.y=stop.y=_1de.t;_1e1={x:0,y:-1};_1e2={y:-_1ea-_1cb};}_1e2.x=0;}this.cleanGroup();try{var s=this.group,c=this.scaler,t=this.ticks,_1eb,f=lin.getTransformerFromModel(this.scaler),_1ec=(dojox.gfx.renderer=="canvas"),_1ed=_1ec||this.opt.htmlLabels&&!dojo.isIE&&!dojo.isOpera?"html":"gfx",dx=_1e1.x*_1e5.length,dy=_1e1.y*_1e5.length;s.createLine({x1:_1df.x,y1:_1df.y,x2:stop.x,y2:stop.y}).setStroke(_1e4);dojo.forEach(t.major,function(tick){var _1ee=f(tick.value),elem,x=_1df.x+_1e0.x*_1ee,y=_1df.y+_1e0.y*_1ee;s.createLine({x1:x,y1:y,x2:x+dx,y2:y+dy}).setStroke(_1e5);if(tick.label){elem=dc.axis2d.common.createText[_1ed](this.chart,s,x+_1e2.x,y+_1e2.y,_1e3,tick.label,_1e8,_1e9,this._cachedLabelWidth);if(_1ed=="html"){this.htmlElements.push(elem);}}},this);dx=_1e1.x*_1e6.length;dy=_1e1.y*_1e6.length;_1eb=c.minMinorStep<=c.minor.tick*c.bounds.scale;dojo.forEach(t.minor,function(tick){var _1ef=f(tick.value),elem,x=_1df.x+_1e0.x*_1ef,y=_1df.y+_1e0.y*_1ef;s.createLine({x1:x,y1:y,x2:x+dx,y2:y+dy}).setStroke(_1e6);if(_1eb&&tick.label){elem=dc.axis2d.common.createText[_1ed](this.chart,s,x+_1e2.x,y+_1e2.y,_1e3,tick.label,_1e8,_1e9,this._cachedLabelWidth);if(_1ed=="html"){this.htmlElements.push(elem);}}},this);dx=_1e1.x*_1e7.length;dy=_1e1.y*_1e7.length;dojo.forEach(t.micro,function(tick){var _1f0=f(tick.value),elem,x=_1df.x+_1e0.x*_1f0,y=_1df.y+_1e0.y*_1f0;s.createLine({x1:x,y1:y,x2:x+dx,y2:y+dy}).setStroke(_1e7);},this);}catch(e){}this.dirty=false;return this;}});})();}if(!dojo._hasResource["dojox.charting.plot2d.common"]){dojo._hasResource["dojox.charting.plot2d.common"]=true;dojo.provide("dojox.charting.plot2d.common");(function(){var df=dojox.lang.functional,dc=dojox.charting.plot2d.common;dojo.mixin(dojox.charting.plot2d.common,{makeStroke:function(_1f1){if(!_1f1){return _1f1;}if(typeof _1f1=="string"||_1f1 instanceof dojo.Color){_1f1={color:_1f1};}return dojox.gfx.makeParameters(dojox.gfx.defaultStroke,_1f1);},augmentColor:function(_1f2,_1f3){var t=new dojo.Color(_1f2),c=new dojo.Color(_1f3);c.a=t.a;return c;},augmentStroke:function(_1f4,_1f5){var s=dc.makeStroke(_1f4);if(s){s.color=dc.augmentColor(s.color,_1f5);}return s;},augmentFill:function(fill,_1f6){var fc,c=new dojo.Color(_1f6);if(typeof fill=="string"||fill instanceof dojo.Color){return dc.augmentColor(fill,_1f6);}return fill;},defaultStats:{hmin:Number.POSITIVE_INFINITY,hmax:Number.NEGATIVE_INFINITY,vmin:Number.POSITIVE_INFINITY,vmax:Number.NEGATIVE_INFINITY},collectSimpleStats:function(_1f7){var _1f8=dojo.clone(dc.defaultStats);for(var i=0;i<_1f7.length;++i){var run=_1f7[i];if(!run.data.length){continue;}if(typeof run.data[0]=="number"){var _1f9=_1f8.vmin,_1fa=_1f8.vmax;if(!("ymin" in run)||!("ymax" in run)){dojo.forEach(run.data,function(val,i){var x=i+1,y=val;if(isNaN(y)){y=0;}_1f8.hmin=Math.min(_1f8.hmin,x);_1f8.hmax=Math.max(_1f8.hmax,x);_1f8.vmin=Math.min(_1f8.vmin,y);_1f8.vmax=Math.max(_1f8.vmax,y);});}if("ymin" in run){_1f8.vmin=Math.min(_1f9,run.ymin);}if("ymax" in run){_1f8.vmax=Math.max(_1fa,run.ymax);}}else{var _1fb=_1f8.hmin,_1fc=_1f8.hmax,_1f9=_1f8.vmin,_1fa=_1f8.vmax;if(!("xmin" in run)||!("xmax" in run)||!("ymin" in run)||!("ymax" in run)){dojo.forEach(run.data,function(val,i){var x="x" in val?val.x:i+1,y=val.y;if(isNaN(x)){x=0;}if(isNaN(y)){y=0;}_1f8.hmin=Math.min(_1f8.hmin,x);_1f8.hmax=Math.max(_1f8.hmax,x);_1f8.vmin=Math.min(_1f8.vmin,y);_1f8.vmax=Math.max(_1f8.vmax,y);});}if("xmin" in run){_1f8.hmin=Math.min(_1fb,run.xmin);}if("xmax" in run){_1f8.hmax=Math.max(_1fc,run.xmax);}if("ymin" in run){_1f8.vmin=Math.min(_1f9,run.ymin);}if("ymax" in run){_1f8.vmax=Math.max(_1fa,run.ymax);}}}return _1f8;},calculateBarSize:function(_1fd,opt,_1fe){if(!_1fe){_1fe=1;}var gap=opt.gap,size=(_1fd-2*gap)/_1fe;if("minBarSize" in opt){size=Math.max(size,opt.minBarSize);}if("maxBarSize" in opt){size=Math.min(size,opt.maxBarSize);}size=Math.max(size,1);gap=(_1fd-size*_1fe)/2;return {size:size,gap:gap};},collectStackedStats:function(_1ff){var _200=dojo.clone(dc.defaultStats);if(_1ff.length){_200.hmin=Math.min(_200.hmin,1);_200.hmax=df.foldl(_1ff,"seed, run -> Math.max(seed, run.data.length)",_200.hmax);for(var i=0;i<_200.hmax;++i){var v=_1ff[0].data[i];if(isNaN(v)){v=0;}_200.vmin=Math.min(_200.vmin,v);for(var j=1;j<_1ff.length;++j){var t=_1ff[j].data[i];if(isNaN(t)){t=0;}v+=t;}_200.vmax=Math.max(_200.vmax,v);}}return _200;},curve:function(a,_201){var arr=a.slice(0);if(_201=="x"){arr[arr.length]=arr[0];}var p=dojo.map(arr,function(item,i){if(i==0){return "M"+item.x+","+item.y;}if(!isNaN(_201)){var dx=item.x-arr[i-1].x,dy=arr[i-1].y;return "C"+(item.x-(_201-1)*(dx/_201))+","+dy+" "+(item.x-(dx/_201))+","+item.y+" "+item.x+","+item.y;}else{if(_201=="X"||_201=="x"||_201=="S"){var p0,p1=arr[i-1],p2=arr[i],p3;var bz1x,bz1y,bz2x,bz2y;var f=1/6;if(i==1){if(_201=="x"){p0=arr[arr.length-2];}else{p0=p1;}f=1/3;}else{p0=arr[i-2];}if(i==(arr.length-1)){if(_201=="x"){p3=arr[1];}else{p3=p2;}f=1/3;}else{p3=arr[i+1];}var p1p2=Math.sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));var p0p2=Math.sqrt((p2.x-p0.x)*(p2.x-p0.x)+(p2.y-p0.y)*(p2.y-p0.y));var p1p3=Math.sqrt((p3.x-p1.x)*(p3.x-p1.x)+(p3.y-p1.y)*(p3.y-p1.y));var _202=p0p2*f;var _203=p1p3*f;if(_202>p1p2/2&&_203>p1p2/2){_202=p1p2/2;_203=p1p2/2;}else{if(_202>p1p2/2){_202=p1p2/2;_203=p1p2/2*p1p3/p0p2;}else{if(_203>p1p2/2){_203=p1p2/2;_202=p1p2/2*p0p2/p1p3;}}}if(_201=="S"){if(p0==p1){_202=0;}if(p2==p3){_203=0;}}bz1x=p1.x+_202*(p2.x-p0.x)/p0p2;bz1y=p1.y+_202*(p2.y-p0.y)/p0p2;bz2x=p2.x-_203*(p3.x-p1.x)/p1p3;bz2y=p2.y-_203*(p3.y-p1.y)/p1p3;}}return "C"+(bz1x+","+bz1y+" "+bz2x+","+bz2y+" "+p2.x+","+p2.y);});return p.join(" ");}});})();}if(!dojo._hasResource["dojox.charting.scaler.primitive"]){dojo._hasResource["dojox.charting.scaler.primitive"]=true;dojo.provide("dojox.charting.scaler.primitive");dojox.charting.scaler.primitive={buildScaler:function(min,max,span,_204){return {bounds:{lower:min,upper:max,from:min,to:max,scale:span/(max-min),span:span},scaler:dojox.charting.scaler.primitive};},buildTicks:function(_205,_206){return {major:[],minor:[],micro:[]};},getTransformerFromModel:function(_207){var _208=_207.bounds.from,_209=_207.bounds.scale;return function(x){return (x-_208)*_209;};},getTransformerFromPlot:function(_20a){var _20b=_20a.bounds.from,_20c=_20a.bounds.scale;return function(x){return x/_20c+_20b;};}};}if(!dojo._hasResource["dojox.charting.plot2d.Base"]){dojo._hasResource["dojox.charting.plot2d.Base"]=true;dojo.provide("dojox.charting.plot2d.Base");dojo.declare("dojox.charting.plot2d.Base",dojox.charting.Element,{destroy:function(){this.resetEvents();this.inherited(arguments);},clear:function(){this.series=[];this._hAxis=null;this._vAxis=null;this.dirty=true;return this;},setAxis:function(axis){if(axis){this[axis.vertical?"_vAxis":"_hAxis"]=axis;}return this;},addSeries:function(run){this.series.push(run);return this;},calculateAxes:function(dim){return this;},isDirty:function(){return this.dirty||this._hAxis&&this._hAxis.dirty||this._vAxis&&this._vAxis.dirty;},render:function(dim,_20d){return this;},getRequiredColors:function(){return this.series.length;},plotEvent:function(o){},connect:function(_20e,_20f){this.dirty=true;return dojo.connect(this,"plotEvent",_20e,_20f);},events:function(){var ls=this.plotEvent._listeners;if(!ls||!ls.length){return false;}for(var i in ls){if(!(i in Array.prototype)){return true;}}return false;},resetEvents:function(){this.plotEvent({type:"onplotreset",plot:this});},_calc:function(dim,_210){if(this._hAxis){if(!this._hAxis.initialized()){this._hAxis.calculate(_210.hmin,_210.hmax,dim.width);}this._hScaler=this._hAxis.getScaler();}else{this._hScaler=dojox.charting.scaler.primitive.buildScaler(_210.hmin,_210.hmax,dim.width);}if(this._vAxis){if(!this._vAxis.initialized()){this._vAxis.calculate(_210.vmin,_210.vmax,dim.height);}this._vScaler=this._vAxis.getScaler();}else{this._vScaler=dojox.charting.scaler.primitive.buildScaler(_210.vmin,_210.vmax,dim.height);}},_connectEvents:function(_211,o){_211.connect("onmouseover",this,function(e){o.type="onmouseover";o.event=e;this.plotEvent(o);});_211.connect("onmouseout",this,function(e){o.type="onmouseout";o.event=e;this.plotEvent(o);});_211.connect("onclick",this,function(e){o.type="onclick";o.event=e;this.plotEvent(o);});}});}if(!dojo._hasResource["dojox.charting.plot2d.Default"]){dojo._hasResource["dojox.charting.plot2d.Default"]=true;dojo.provide("dojox.charting.plot2d.Default");(function(){var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_212=df.lambda("item.purgeGroup()");dojo.declare("dojox.charting.plot2d.Default",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",lines:true,areas:false,markers:false,shadows:0,tension:0},optionalParams:{},constructor:function(_213,_214){this.opt=dojo.clone(this.defaultParams);du.updateWithObject(this.opt,_214);this.series=[];this.hAxis=this.opt.hAxis;this.vAxis=this.opt.vAxis;},calculateAxes:function(dim){this._calc(dim,dc.collectSimpleStats(this.series));return this;},render:function(dim,_215){this.dirty=this.isDirty();if(this.dirty){dojo.forEach(this.series,_212);this.cleanGroup();var s=this.group;df.forEachRev(this.series,function(item){item.cleanGroup(s);});}var t=this.chart.theme,_216,_217,_218,_219,_21a=this.events();this.resetEvents();for(var i=this.series.length-1;i>=0;--i){var run=this.series[i];if(!this.dirty&&!run.dirty){continue;}run.cleanGroup();if(!run.data.length){run.dirty=false;continue;}var s=run.group,_21b,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler);if(typeof run.data[0]=="number"){_21b=dojo.map(run.data,function(v,i){return {x:ht(i+1)+_215.l,y:dim.height-_215.b-vt(v)};},this);}else{_21b=dojo.map(run.data,function(v,i){return {x:ht(v.x)+_215.l,y:dim.height-_215.b-vt(v.y)};},this);}if(!run.fill||!run.stroke){_218=run.dyn.color=new dojo.Color(t.next("color"));}var _21c=this.opt.tension?dc.curve(_21b,this.opt.tension):"";if(this.opt.areas){var fill=run.fill?run.fill:dc.augmentFill(t.series.fill,_218);var _21d=dojo.clone(_21b);if(this.opt.tension){var _21e="L"+_21d[_21d.length-1].x+","+(dim.height-_215.b)+" L"+_21d[0].x+","+(dim.height-_215.b)+" L"+_21d[0].x+","+_21d[0].y;run.dyn.fill=s.createPath(_21c+" "+_21e).setFill(fill).getFill();}else{_21d.push({x:_21b[_21b.length-1].x,y:dim.height-_215.b});_21d.push({x:_21b[0].x,y:dim.height-_215.b});_21d.push(_21b[0]);run.dyn.fill=s.createPolyline(_21d).setFill(fill).getFill();}}if(this.opt.lines||this.opt.markers){_216=run.dyn.stroke=run.stroke?dc.makeStroke(run.stroke):dc.augmentStroke(t.series.stroke,_218);if(run.outline||t.series.outline){_217=run.dyn.outline=dc.makeStroke(run.outline?run.outline:t.series.outline);_217.width=2*_217.width+_216.width;}}if(this.opt.markers){_219=run.dyn.marker=run.marker?run.marker:t.next("marker");}var _21f=null,_220=null,_221=null;if(this.opt.shadows&&_216){var sh=this.opt.shadows,_222=new dojo.Color([0,0,0,0.3]),_223=dojo.map(_21b,function(c){return {x:c.x+sh.dx,y:c.y+sh.dy};}),_224=dojo.clone(_217?_217:_216);_224.color=_222;_224.width+=sh.dw?sh.dw:0;if(this.opt.lines){if(this.opt.tension){run.dyn.shadow=s.createPath(dc.curve(_223,this.opt.tension)).setStroke(_224).getStroke();}else{run.dyn.shadow=s.createPolyline(_223).setStroke(_224).getStroke();}}if(this.opt.markers){_221=dojo.map(_223,function(c){return s.createPath("M"+c.x+" "+c.y+" "+_219).setStroke(_224).setFill(_222);},this);}}if(this.opt.lines){if(_217){if(this.opt.tension){run.dyn.outline=s.createPath(_21c).setStroke(_217).getStroke();}else{run.dyn.outline=s.createPolyline(_21b).setStroke(_217).getStroke();}}if(this.opt.tension){run.dyn.stroke=s.createPath(_21c).setStroke(_216).getStroke();}else{run.dyn.stroke=s.createPolyline(_21b).setStroke(_216).getStroke();}}if(this.opt.markers){_21f=new Array(_21b.length);_220=new Array(_21b.length);dojo.forEach(_21b,function(c,i){var path="M"+c.x+" "+c.y+" "+_219;if(_217){_220[i]=s.createPath(path).setStroke(_217);}_21f[i]=s.createPath(path).setStroke(_216).setFill(_216.color);},this);if(_21a){dojo.forEach(_21f,function(s,i){var o={element:"marker",index:i,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:s,outline:_220[i]||null,shadow:_221&&_221[i]||null,cx:_21b[i].x,cy:_21b[i].y};if(typeof run.data[0]=="number"){o.x=i+1;o.y=run.data[i];}else{o.x=run.data[i].x;o.y=run.data[i].y;}this._connectEvents(s,o);},this);}}run.dirty=false;}this.dirty=false;return this;}});})();}if(!dojo._hasResource["dojox.charting.plot2d.Lines"]){dojo._hasResource["dojox.charting.plot2d.Lines"]=true;dojo.provide("dojox.charting.plot2d.Lines");dojo.declare("dojox.charting.plot2d.Lines",dojox.charting.plot2d.Default,{constructor:function(){this.opt.lines=true;}});}if(!dojo._hasResource["dojox.charting.plot2d.Areas"]){dojo._hasResource["dojox.charting.plot2d.Areas"]=true;dojo.provide("dojox.charting.plot2d.Areas");dojo.declare("dojox.charting.plot2d.Areas",dojox.charting.plot2d.Default,{constructor:function(){this.opt.lines=true;this.opt.areas=true;}});}if(!dojo._hasResource["dojox.charting.plot2d.Markers"]){dojo._hasResource["dojox.charting.plot2d.Markers"]=true;dojo.provide("dojox.charting.plot2d.Markers");dojo.declare("dojox.charting.plot2d.Markers",dojox.charting.plot2d.Default,{constructor:function(){this.opt.markers=true;}});}if(!dojo._hasResource["dojox.charting.plot2d.MarkersOnly"]){dojo._hasResource["dojox.charting.plot2d.MarkersOnly"]=true;dojo.provide("dojox.charting.plot2d.MarkersOnly");dojo.declare("dojox.charting.plot2d.MarkersOnly",dojox.charting.plot2d.Default,{constructor:function(){this.opt.lines=false;this.opt.markers=true;}});}if(!dojo._hasResource["dojox.charting.plot2d.Scatter"]){dojo._hasResource["dojox.charting.plot2d.Scatter"]=true;dojo.provide("dojox.charting.plot2d.Scatter");dojo.declare("dojox.charting.plot2d.Scatter",dojox.charting.plot2d.Default,{constructor:function(){this.opt.lines=false;this.opt.markers=true;}});}if(!dojo._hasResource["dojox.lang.functional.sequence"]){dojo._hasResource["dojox.lang.functional.sequence"]=true;dojo.provide("dojox.lang.functional.sequence");(function(){var d=dojo,df=dojox.lang.functional;d.mixin(df,{repeat:function(n,f,z,o){o=o||d.global;f=df.lambda(f);var t=new Array(n),i=1;t[0]=z;for(;i<n;t[i]=z=f.call(o,z),++i){}return t;},until:function(pr,f,z,o){o=o||d.global;f=df.lambda(f);pr=df.lambda(pr);var t=[];for(;!pr.call(o,z);t.push(z),z=f.call(o,z)){}return t;}});})();}if(!dojo._hasResource["dojox.charting.plot2d.Stacked"]){dojo._hasResource["dojox.charting.plot2d.Stacked"]=true;dojo.provide("dojox.charting.plot2d.Stacked");(function(){var df=dojox.lang.functional,dc=dojox.charting.plot2d.common,_225=df.lambda("item.purgeGroup()");dojo.declare("dojox.charting.plot2d.Stacked",dojox.charting.plot2d.Default,{calculateAxes:function(dim){var _226=dc.collectStackedStats(this.series);this._maxRunLength=_226.hmax;this._calc(dim,_226);return this;},render:function(dim,_227){if(this._maxRunLength<=0){return this;}var acc=df.repeat(this._maxRunLength,"-> 0",0);for(var i=0;i<this.series.length;++i){var run=this.series[i];for(var j=0;j<run.data.length;++j){var v=run.data[j];if(isNaN(v)){v=0;}acc[j]+=v;}}this.dirty=this.isDirty();if(this.dirty){dojo.forEach(this.series,_225);this.cleanGroup();var s=this.group;df.forEachRev(this.series,function(item){item.cleanGroup(s);});}var t=this.chart.theme,_228,_229,_22a,_22b,_22c=this.events(),ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler);this.resetEvents();for(var i=this.series.length-1;i>=0;--i){var run=this.series[i];if(!this.dirty&&!run.dirty){continue;}run.cleanGroup();var s=run.group,_22d=dojo.map(acc,function(v,i){return {x:ht(i+1)+_227.l,y:dim.height-_227.b-vt(v)};},this);if(!run.fill||!run.stroke){_22a=new dojo.Color(t.next("color"));}var _22e=this.opt.tension?dc.curve(_22d,this.opt.tension):"";if(this.opt.areas){var _22f=dojo.clone(_22d);var fill=run.fill?run.fill:dc.augmentFill(t.series.fill,_22a);if(this.opt.tension){var p=dc.curve(_22f,this.opt.tension);p+=" L"+_22d[_22d.length-1].x+","+(dim.height-_227.b)+" L"+_22d[0].x+","+(dim.height-_227.b)+" L"+_22d[0].x+","+_22d[0].y;run.dyn.fill=s.createPath(p).setFill(fill).getFill();}else{_22f.push({x:_22d[_22d.length-1].x,y:dim.height-_227.b});_22f.push({x:_22d[0].x,y:dim.height-_227.b});_22f.push(_22d[0]);run.dyn.fill=s.createPolyline(_22f).setFill(fill).getFill();}}if(this.opt.lines||this.opt.markers){_228=run.stroke?dc.makeStroke(run.stroke):dc.augmentStroke(t.series.stroke,_22a);if(run.outline||t.series.outline){_229=dc.makeStroke(run.outline?run.outline:t.series.outline);_229.width=2*_229.width+_228.width;}}if(this.opt.markers){_22b=run.dyn.marker=run.marker?run.marker:t.next("marker");}var _230,_231,_232;if(this.opt.shadows&&_228){var sh=this.opt.shadows,_233=new dojo.Color([0,0,0,0.3]),_234=dojo.map(_22d,function(c){return {x:c.x+sh.dx,y:c.y+sh.dy};}),_235=dojo.clone(_229?_229:_228);_235.color=_233;_235.width+=sh.dw?sh.dw:0;if(this.opt.lines){if(this.opt.tension){run.dyn.shadow=s.createPath(dc.curve(_234,this.opt.tension)).setStroke(_235).getStroke();}else{run.dyn.shadow=s.createPolyline(_234).setStroke(_235).getStroke();}}if(this.opt.markers){_232=dojo.map(_234,function(c){return s.createPath("M"+c.x+" "+c.y+" "+_22b).setStroke(_235).setFill(_233);},this);}}if(this.opt.lines){if(_229){if(this.opt.tension){run.dyn.outline=s.createPath(_22e).setStroke(_229).getStroke();}else{run.dyn.outline=s.createPolyline(_22d).setStroke(_229).getStroke();}}if(this.opt.tension){run.dyn.stroke=s.createPath(_22e).setStroke(_228).getStroke();}else{run.dyn.stroke=s.createPolyline(_22d).setStroke(_228).getStroke();}}if(this.opt.markers){_230=new Array(_22d.length);_231=new Array(_22d.length);dojo.forEach(_22d,function(c,i){var path="M"+c.x+" "+c.y+" "+_22b;if(_229){_231[i]=s.createPath(path).setStroke(_229);}_230[i]=s.createPath(path).setStroke(_228).setFill(_228.color);},this);if(_22c){dojo.forEach(_230,function(s,i){var o={element:"marker",index:i,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:s,outline:_231[i]||null,shadow:_232&&_232[i]||null,cx:_22d[i].x,cy:_22d[i].y,x:i+1,y:run.data[i]};this._connectEvents(s,o);},this);}}run.dirty=false;for(var j=0;j<run.data.length;++j){var v=run.data[j];if(isNaN(v)){v=0;}acc[j]-=v;}}this.dirty=false;return this;}});})();}if(!dojo._hasResource["dojox.charting.plot2d.StackedLines"]){dojo._hasResource["dojox.charting.plot2d.StackedLines"]=true;dojo.provide("dojox.charting.plot2d.StackedLines");dojo.declare("dojox.charting.plot2d.StackedLines",dojox.charting.plot2d.Stacked,{constructor:function(){this.opt.lines=true;}});}if(!dojo._hasResource["dojox.charting.plot2d.StackedAreas"]){dojo._hasResource["dojox.charting.plot2d.StackedAreas"]=true;dojo.provide("dojox.charting.plot2d.StackedAreas");dojo.declare("dojox.charting.plot2d.StackedAreas",dojox.charting.plot2d.Stacked,{constructor:function(){this.opt.lines=true;this.opt.areas=true;}});}if(!dojo._hasResource["dojox.gfx.fx"]){dojo._hasResource["dojox.gfx.fx"]=true;dojo.provide("dojox.gfx.fx");(function(){var d=dojo,g=dojox.gfx,m=g.matrix;var _236=function(_237,end){this.start=_237,this.end=end;};d.extend(_236,{getValue:function(r){return (this.end-this.start)*r+this.start;}});var _238=function(_239,end,_23a){this.start=_239,this.end=end;this.units=_23a;};d.extend(_238,{getValue:function(r){return (this.end-this.start)*r+this.start+this.units;}});var _23b=function(_23c,end){this.start=_23c,this.end=end;this.temp=new dojo.Color();};d.extend(_23b,{getValue:function(r){return d.blendColors(this.start,this.end,r,this.temp);}});var _23d=function(_23e){this.values=_23e;this.length=_23e.length;};d.extend(_23d,{getValue:function(r){return this.values[Math.min(Math.floor(r*this.length),this.length-1)];}});var _23f=function(_240,def){this.values=_240;this.def=def?def:{};};d.extend(_23f,{getValue:function(r){var ret=dojo.clone(this.def);for(var i in this.values){ret[i]=this.values[i].getValue(r);}return ret;}});var _241=function(_242,_243){this.stack=_242;this.original=_243;};d.extend(_241,{getValue:function(r){var ret=[];dojo.forEach(this.stack,function(t){if(t instanceof m.Matrix2D){ret.push(t);return;}if(t.name=="original"&&this.original){ret.push(this.original);return;}if(!(t.name in m)){return;}var f=m[t.name];if(typeof f!="function"){ret.push(f);return;}var val=dojo.map(t.start,function(v,i){return (t.end[i]-v)*r+v;}),_244=f.apply(m,val);if(_244 instanceof m.Matrix2D){ret.push(_244);}},this);return ret;}});var _245=new d.Color(0,0,0,0);var _246=function(prop,obj,name,def){if(prop.values){return new _23d(prop.values);}var _247,_248,end;if(prop.start){_248=g.normalizeColor(prop.start);}else{_248=_247=obj?(name?obj[name]:obj):def;}if(prop.end){end=g.normalizeColor(prop.end);}else{if(!_247){_247=obj?(name?obj[name]:obj):def;}end=_247;}return new _23b(_248,end);};var _249=function(prop,obj,name,def){if(prop.values){return new _23d(prop.values);}var _24a,_24b,end;if(prop.start){_24b=prop.start;}else{_24b=_24a=obj?obj[name]:def;}if(prop.end){end=prop.end;}else{if(typeof _24a!="number"){_24a=obj?obj[name]:def;}end=_24a;}return new _236(_24b,end);};g.fx.animateStroke=function(args){if(!args.easing){args.easing=d._defaultEasing;}var anim=new d.Animation(args),_24c=args.shape,_24d;d.connect(anim,"beforeBegin",anim,function(){_24d=_24c.getStroke();var prop=args.color,_24e={},_24f,_250,end;if(prop){_24e.color=_246(prop,_24d,"color",_245);}prop=args.style;if(prop&&prop.values){_24e.style=new _23d(prop.values);}prop=args.width;if(prop){_24e.width=_249(prop,_24d,"width",1);}prop=args.cap;if(prop&&prop.values){_24e.cap=new _23d(prop.values);}prop=args.join;if(prop){if(prop.values){_24e.join=new _23d(prop.values);}else{_250=prop.start?prop.start:(_24d&&_24d.join||0);end=prop.end?prop.end:(_24d&&_24d.join||0);if(typeof _250=="number"&&typeof end=="number"){_24e.join=new _236(_250,end);}}}this.curve=new _23f(_24e,_24d);});d.connect(anim,"onAnimate",_24c,"setStroke");return anim;};g.fx.animateFill=function(args){if(!args.easing){args.easing=d._defaultEasing;}var anim=new d.Animation(args),_251=args.shape,fill;d.connect(anim,"beforeBegin",anim,function(){fill=_251.getFill();var prop=args.color,_252={};if(prop){this.curve=_246(prop,fill,"",_245);}});d.connect(anim,"onAnimate",_251,"setFill");return anim;};g.fx.animateFont=function(args){if(!args.easing){args.easing=d._defaultEasing;}var anim=new d.Animation(args),_253=args.shape,font;d.connect(anim,"beforeBegin",anim,function(){font=_253.getFont();var prop=args.style,_254={},_255,_256,end;if(prop&&prop.values){_254.style=new _23d(prop.values);}prop=args.variant;if(prop&&prop.values){_254.variant=new _23d(prop.values);}prop=args.weight;if(prop&&prop.values){_254.weight=new _23d(prop.values);}prop=args.family;if(prop&&prop.values){_254.family=new _23d(prop.values);}prop=args.size;if(prop&&prop.units){_256=parseFloat(prop.start?prop.start:(_253.font&&_253.font.size||"0"));end=parseFloat(prop.end?prop.end:(_253.font&&_253.font.size||"0"));_254.size=new _238(_256,end,prop.units);}this.curve=new _23f(_254,font);});d.connect(anim,"onAnimate",_253,"setFont");return anim;};g.fx.animateTransform=function(args){if(!args.easing){args.easing=d._defaultEasing;}var anim=new d.Animation(args),_257=args.shape,_258;d.connect(anim,"beforeBegin",anim,function(){_258=_257.getTransform();this.curve=new _241(args.transform,_258);});d.connect(anim,"onAnimate",_257,"setTransform");return anim;};})();}if(!dojo._hasResource["dojox.charting.plot2d.Columns"]){dojo._hasResource["dojox.charting.plot2d.Columns"]=true;dojo.provide("dojox.charting.plot2d.Columns");(function(){var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_259=df.lambda("item.purgeGroup()");dojo.declare("dojox.charting.plot2d.Columns",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",gap:0,shadows:null,animate:null},optionalParams:{minBarSize:1,maxBarSize:1},constructor:function(_25a,_25b){this.opt=dojo.clone(this.defaultParams);du.updateWithObject(this.opt,_25b);du.updateWithPattern(this.opt,_25b,this.optionalParams);this.series=[];this.hAxis=this.opt.hAxis;this.vAxis=this.opt.vAxis;this.animate=this.opt.animate;},calculateAxes:function(dim){var _25c=dc.collectSimpleStats(this.series);_25c.hmin-=0.5;_25c.hmax+=0.5;this._calc(dim,_25c);return this;},render:function(dim,_25d){this.dirty=this.isDirty();if(this.dirty){dojo.forEach(this.series,_259);this.cleanGroup();var s=this.group;df.forEachRev(this.series,function(item){item.cleanGroup(s);});}var t=this.chart.theme,_25e,_25f,fill,f,gap,_260,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_261=Math.max(0,this._vScaler.bounds.lower),_262=vt(_261),_263=this.events();f=dc.calculateBarSize(this._hScaler.bounds.scale,this.opt);gap=f.gap;_260=f.size;this.resetEvents();for(var i=this.series.length-1;i>=0;--i){var run=this.series[i];if(!this.dirty&&!run.dirty){continue;}run.cleanGroup();var s=run.group;if(!run.fill||!run.stroke){_25e=run.dyn.color=new dojo.Color(t.next("color"));}_25f=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_25e);fill=run.fill?run.fill:dc.augmentFill(t.series.fill,_25e);for(var j=0;j<run.data.length;++j){var _264=run.data[j],v=typeof _264=="number"?_264:_264.y,vv=vt(v),_265=vv-_262,h=Math.abs(_265),_266=_25e,_267=fill,_268=_25f;if(typeof _264!="number"){if(_264.color){_266=new dojo.Color(_264.color);}if("fill" in _264){_267=_264.fill;}else{if(_264.color){_267=dc.augmentFill(t.series.fill,_266);}}if("stroke" in _264){_268=_264.stroke;}else{if(_264.color){_268=dc.augmentStroke(t.series.stroke,_266);}}}if(_260>=1&&h>=1){var _269=s.createRect({x:_25d.l+ht(j+0.5)+gap,y:dim.height-_25d.b-(v>_261?vv:_262),width:_260,height:h}).setFill(_267).setStroke(_268);run.dyn.fill=_269.getFill();run.dyn.stroke=_269.getStroke();if(_263){var o={element:"column",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_269,x:j+0.5,y:v};this._connectEvents(_269,o);}if(this.animate){this._animateColumn(_269,dim.height-_25d.b-_262,h);}}}run.dirty=false;}this.dirty=false;return this;},_animateColumn:function(_26a,_26b,_26c){dojox.gfx.fx.animateTransform(dojo.delegate({shape:_26a,duration:1200,transform:[{name:"translate",start:[0,_26b-(_26b/_26c)],end:[0,0]},{name:"scale",start:[1,1/_26c],end:[1,1]},{name:"original"}]},this.animate)).play();}});})();}if(!dojo._hasResource["dojox.charting.plot2d.StackedColumns"]){dojo._hasResource["dojox.charting.plot2d.StackedColumns"]=true;dojo.provide("dojox.charting.plot2d.StackedColumns");(function(){var df=dojox.lang.functional,dc=dojox.charting.plot2d.common,_26d=df.lambda("item.purgeGroup()");dojo.declare("dojox.charting.plot2d.StackedColumns",dojox.charting.plot2d.Columns,{calculateAxes:function(dim){var _26e=dc.collectStackedStats(this.series);this._maxRunLength=_26e.hmax;_26e.hmin-=0.5;_26e.hmax+=0.5;this._calc(dim,_26e);return this;},render:function(dim,_26f){if(this._maxRunLength<=0){return this;}var acc=df.repeat(this._maxRunLength,"-> 0",0);for(var i=0;i<this.series.length;++i){var run=this.series[i];for(var j=0;j<run.data.length;++j){var _270=run.data[j],v=typeof _270=="number"?_270:_270.y;if(isNaN(v)){v=0;}acc[j]+=v;}}this.dirty=this.isDirty();if(this.dirty){dojo.forEach(this.series,_26d);this.cleanGroup();var s=this.group;df.forEachRev(this.series,function(item){item.cleanGroup(s);});}var t=this.chart.theme,_271,_272,fill,f,gap,_273,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_274=this.events();f=dc.calculateBarSize(this._hScaler.bounds.scale,this.opt);gap=f.gap;_273=f.size;this.resetEvents();for(var i=this.series.length-1;i>=0;--i){var run=this.series[i];if(!this.dirty&&!run.dirty){continue;}run.cleanGroup();var s=run.group;if(!run.fill||!run.stroke){_271=run.dyn.color=new dojo.Color(t.next("color"));}_272=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_271);fill=run.fill?run.fill:dc.augmentFill(t.series.fill,_271);for(var j=0;j<acc.length;++j){var v=acc[j],_275=vt(v),_270=run.data[j],_276=_271,_277=fill,_278=_272;if(typeof _270!="number"){if(_270.color){_276=new dojo.Color(_270.color);}if("fill" in _270){_277=_270.fill;}else{if(_270.color){_277=dc.augmentFill(t.series.fill,_276);}}if("stroke" in _270){_278=_270.stroke;}else{if(_270.color){_278=dc.augmentStroke(t.series.stroke,_276);}}}if(_273>=1&&_275>=1){var _279=s.createRect({x:_26f.l+ht(j+0.5)+gap,y:dim.height-_26f.b-vt(v),width:_273,height:_275}).setFill(_277).setStroke(_278);run.dyn.fill=_279.getFill();run.dyn.stroke=_279.getStroke();if(_274){var o={element:"column",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_279,x:j+0.5,y:v};this._connectEvents(_279,o);}if(this.animate){this._animateColumn(_279,dim.height-_26f.b,_275);}}}run.dirty=false;for(var j=0;j<run.data.length;++j){var _270=run.data[j],v=typeof _270=="number"?_270:_270.y;if(isNaN(v)){v=0;}acc[j]-=v;}}this.dirty=false;return this;}});})();}if(!dojo._hasResource["dojox.charting.plot2d.ClusteredColumns"]){dojo._hasResource["dojox.charting.plot2d.ClusteredColumns"]=true;dojo.provide("dojox.charting.plot2d.ClusteredColumns");(function(){var df=dojox.lang.functional,dc=dojox.charting.plot2d.common,_27a=df.lambda("item.purgeGroup()");dojo.declare("dojox.charting.plot2d.ClusteredColumns",dojox.charting.plot2d.Columns,{render:function(dim,_27b){this.dirty=this.isDirty();if(this.dirty){dojo.forEach(this.series,_27a);this.cleanGroup();var s=this.group;df.forEachRev(this.series,function(item){item.cleanGroup(s);});}var t=this.chart.theme,_27c,_27d,fill,f,gap,_27e,_27f,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_280=Math.max(0,this._vScaler.bounds.lower),_281=vt(_280),_282=this.events();f=dc.calculateBarSize(this._hScaler.bounds.scale,this.opt,this.series.length);gap=f.gap;_27e=_27f=f.size;this.resetEvents();for(var i=0;i<this.series.length;++i){var run=this.series[i],_283=_27f*i;if(!this.dirty&&!run.dirty){continue;}run.cleanGroup();var s=run.group;if(!run.fill||!run.stroke){_27c=run.dyn.color=new dojo.Color(t.next("color"));}_27d=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_27c);fill=run.fill?run.fill:dc.augmentFill(t.series.fill,_27c);for(var j=0;j<run.data.length;++j){var _284=run.data[j],v=typeof _284=="number"?_284:_284.y,vv=vt(v),_285=vv-_281,h=Math.abs(_285),_286=_27c,_287=fill,_288=_27d;if(typeof _284!="number"){if(_284.color){_286=new dojo.Color(_284.color);}if("fill" in _284){_287=_284.fill;}else{if(_284.color){_287=dc.augmentFill(t.series.fill,_286);}}if("stroke" in _284){_288=_284.stroke;}else{if(_284.color){_288=dc.augmentStroke(t.series.stroke,_286);}}}if(_27e>=1&&h>=1){var _289=s.createRect({x:_27b.l+ht(j+0.5)+gap+_283,y:dim.height-_27b.b-(v>_280?vv:_281),width:_27e,height:h}).setFill(_287).setStroke(_288);run.dyn.fill=_289.getFill();run.dyn.stroke=_289.getStroke();if(_282){var o={element:"column",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_289,x:j+0.5,y:v};this._connectEvents(_289,o);}if(this.animate){this._animateColumn(_289,dim.height-_27b.b-_281,h);}}}run.dirty=false;}this.dirty=false;return this;}});})();}if(!dojo._hasResource["dojox.charting.plot2d.Bars"]){dojo._hasResource["dojox.charting.plot2d.Bars"]=true;dojo.provide("dojox.charting.plot2d.Bars");(function(){var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_28a=df.lambda("item.purgeGroup()");dojo.declare("dojox.charting.plot2d.Bars",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",gap:0,shadows:null,animate:null},optionalParams:{minBarSize:1,maxBarSize:1},constructor:function(_28b,_28c){this.opt=dojo.clone(this.defaultParams);du.updateWithObject(this.opt,_28c);du.updateWithPattern(this.opt,_28c,this.optionalParams);this.series=[];this.hAxis=this.opt.hAxis;this.vAxis=this.opt.vAxis;this.animate=this.opt.animate;},calculateAxes:function(dim){var _28d=dc.collectSimpleStats(this.series),t;_28d.hmin-=0.5;_28d.hmax+=0.5;t=_28d.hmin,_28d.hmin=_28d.vmin,_28d.vmin=t;t=_28d.hmax,_28d.hmax=_28d.vmax,_28d.vmax=t;this._calc(dim,_28d);return this;},render:function(dim,_28e){this.dirty=this.isDirty();if(this.dirty){dojo.forEach(this.series,_28a);this.cleanGroup();var s=this.group;df.forEachRev(this.series,function(item){item.cleanGroup(s);});}var t=this.chart.theme,_28f,_290,fill,f,gap,_291,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_292=Math.max(0,this._hScaler.bounds.lower),_293=ht(_292),_294=this.events();f=dc.calculateBarSize(this._vScaler.bounds.scale,this.opt);gap=f.gap;_291=f.size;this.resetEvents();for(var i=this.series.length-1;i>=0;--i){var run=this.series[i];if(!this.dirty&&!run.dirty){continue;}run.cleanGroup();var s=run.group;if(!run.fill||!run.stroke){_28f=run.dyn.color=new dojo.Color(t.next("color"));}_290=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_28f);fill=run.fill?run.fill:dc.augmentFill(t.series.fill,_28f);for(var j=0;j<run.data.length;++j){var _295=run.data[j],v=typeof _295=="number"?_295:_295.y,hv=ht(v),_296=hv-_293,w=Math.abs(_296),_297=_28f,_298=fill,_299=_290;if(typeof _295!="number"){if(_295.color){_297=new dojo.Color(_295.color);}if("fill" in _295){_298=_295.fill;}else{if(_295.color){_298=dc.augmentFill(t.series.fill,_297);}}if("stroke" in _295){_299=_295.stroke;}else{if(_295.color){_299=dc.augmentStroke(t.series.stroke,_297);}}}if(w>=1&&_291>=1){var _29a=s.createRect({x:_28e.l+(v<_292?hv:_293),y:dim.height-_28e.b-vt(j+1.5)+gap,width:w,height:_291}).setFill(_298).setStroke(_299);run.dyn.fill=_29a.getFill();run.dyn.stroke=_29a.getStroke();if(_294){var o={element:"bar",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_29a,x:v,y:j+1.5};this._connectEvents(_29a,o);}if(this.animate){this._animateBar(_29a,_28e.l+_293,-w);}}}run.dirty=false;}this.dirty=false;return this;},_animateBar:function(_29b,_29c,_29d){dojox.gfx.fx.animateTransform(dojo.delegate({shape:_29b,duration:1200,transform:[{name:"translate",start:[_29c-(_29c/_29d),0],end:[0,0]},{name:"scale",start:[1/_29d,1],end:[1,1]},{name:"original"}]},this.animate)).play();}});})();}if(!dojo._hasResource["dojox.charting.plot2d.StackedBars"]){dojo._hasResource["dojox.charting.plot2d.StackedBars"]=true;dojo.provide("dojox.charting.plot2d.StackedBars");(function(){var df=dojox.lang.functional,dc=dojox.charting.plot2d.common,_29e=df.lambda("item.purgeGroup()");dojo.declare("dojox.charting.plot2d.StackedBars",dojox.charting.plot2d.Bars,{calculateAxes:function(dim){var _29f=dc.collectStackedStats(this.series),t;this._maxRunLength=_29f.hmax;_29f.hmin-=0.5;_29f.hmax+=0.5;t=_29f.hmin,_29f.hmin=_29f.vmin,_29f.vmin=t;t=_29f.hmax,_29f.hmax=_29f.vmax,_29f.vmax=t;this._calc(dim,_29f);return this;},render:function(dim,_2a0){if(this._maxRunLength<=0){return this;}var acc=df.repeat(this._maxRunLength,"-> 0",0);for(var i=0;i<this.series.length;++i){var run=this.series[i];for(var j=0;j<run.data.length;++j){var _2a1=run.data[j],v=typeof _2a1=="number"?_2a1:_2a1.y;if(isNaN(v)){v=0;}acc[j]+=v;}}this.dirty=this.isDirty();if(this.dirty){dojo.forEach(this.series,_29e);this.cleanGroup();var s=this.group;df.forEachRev(this.series,function(item){item.cleanGroup(s);});}var t=this.chart.theme,_2a2,_2a3,fill,f,gap,_2a4,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_2a5=this.events();f=dc.calculateBarSize(this._vScaler.bounds.scale,this.opt);gap=f.gap;_2a4=f.size;this.resetEvents();for(var i=this.series.length-1;i>=0;--i){var run=this.series[i];if(!this.dirty&&!run.dirty){continue;}run.cleanGroup();var s=run.group;if(!run.fill||!run.stroke){_2a2=run.dyn.color=new dojo.Color(t.next("color"));}_2a3=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_2a2);fill=run.fill?run.fill:dc.augmentFill(t.series.fill,_2a2);for(var j=0;j<acc.length;++j){var v=acc[j],_2a6=ht(v),_2a1=run.data[j],_2a7=_2a2,_2a8=fill,_2a9=_2a3;if(typeof _2a1!="number"){if(_2a1.color){_2a7=new dojo.Color(_2a1.color);}if("fill" in _2a1){_2a8=_2a1.fill;}else{if(_2a1.color){_2a8=dc.augmentFill(t.series.fill,_2a7);}}if("stroke" in _2a1){_2a9=_2a1.stroke;}else{if(_2a1.color){_2a9=dc.augmentStroke(t.series.stroke,_2a7);}}}if(_2a6>=1&&_2a4>=1){var _2aa=s.createRect({x:_2a0.l,y:dim.height-_2a0.b-vt(j+1.5)+gap,width:_2a6,height:_2a4}).setFill(_2a8).setStroke(_2a9);run.dyn.fill=_2aa.getFill();run.dyn.stroke=_2aa.getStroke();if(_2a5){var o={element:"bar",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_2aa,x:v,y:j+1.5};this._connectEvents(_2aa,o);}if(this.animate){this._animateBar(_2aa,_2a0.l,-_2a6);}}}run.dirty=false;for(var j=0;j<run.data.length;++j){var _2a1=run.data[j],v=typeof _2a1=="number"?_2a1:_2a1.y;if(isNaN(v)){v=0;}acc[j]-=v;}}this.dirty=false;return this;}});})();}if(!dojo._hasResource["dojox.charting.plot2d.ClusteredBars"]){dojo._hasResource["dojox.charting.plot2d.ClusteredBars"]=true;dojo.provide("dojox.charting.plot2d.ClusteredBars");(function(){var df=dojox.lang.functional,dc=dojox.charting.plot2d.common,_2ab=df.lambda("item.purgeGroup()");dojo.declare("dojox.charting.plot2d.ClusteredBars",dojox.charting.plot2d.Bars,{render:function(dim,_2ac){this.dirty=this.isDirty();if(this.dirty){dojo.forEach(this.series,_2ab);this.cleanGroup();var s=this.group;df.forEachRev(this.series,function(item){item.cleanGroup(s);});}var t=this.chart.theme,_2ad,_2ae,fill,f,gap,_2af,_2b0,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_2b1=Math.max(0,this._hScaler.bounds.lower),_2b2=ht(_2b1),_2b3=this.events();f=dc.calculateBarSize(this._vScaler.bounds.scale,this.opt,this.series.length);gap=f.gap;_2af=_2b0=f.size;this.resetEvents();for(var i=this.series.length-1;i>=0;--i){var run=this.series[i],_2b4=_2b0*(this.series.length-i-1);if(!this.dirty&&!run.dirty){continue;}run.cleanGroup();var s=run.group;if(!run.fill||!run.stroke){_2ad=run.dyn.color=new dojo.Color(t.next("color"));}_2ae=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_2ad);fill=run.fill?run.fill:dc.augmentFill(t.series.fill,_2ad);for(var j=0;j<run.data.length;++j){var _2b5=run.data[j],v=typeof _2b5=="number"?_2b5:_2b5.y,hv=ht(v),_2b6=hv-_2b2,w=Math.abs(_2b6),_2b7=_2ad,_2b8=fill,_2b9=_2ae;if(typeof _2b5!="number"){if(_2b5.color){_2b7=new dojo.Color(_2b5.color);}if("fill" in _2b5){_2b8=_2b5.fill;}else{if(_2b5.color){_2b8=dc.augmentFill(t.series.fill,_2b7);}}if("stroke" in _2b5){_2b9=_2b5.stroke;}else{if(_2b5.color){_2b9=dc.augmentStroke(t.series.stroke,_2b7);}}}if(w>=1&&_2af>=1){var _2ba=s.createRect({x:_2ac.l+(v<_2b1?hv:_2b2),y:dim.height-_2ac.b-vt(j+1.5)+gap+_2b4,width:w,height:_2af}).setFill(_2b8).setStroke(_2b9);run.dyn.fill=_2ba.getFill();run.dyn.stroke=_2ba.getStroke();if(_2b3){var o={element:"bar",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_2ba,x:v,y:j+1.5};this._connectEvents(_2ba,o);}if(this.animate){this._animateBar(_2ba,_2ac.l+_2b2,-_2b6);}}}run.dirty=false;}this.dirty=false;return this;}});})();}if(!dojo._hasResource["dojox.charting.plot2d.Grid"]){dojo._hasResource["dojox.charting.plot2d.Grid"]=true;dojo.provide("dojox.charting.plot2d.Grid");(function(){var du=dojox.lang.utils;dojo.declare("dojox.charting.plot2d.Grid",dojox.charting.Element,{defaultParams:{hAxis:"x",vAxis:"y",hMajorLines:true,hMinorLines:false,vMajorLines:true,vMinorLines:false,hStripes:"none",vStripes:"none"},optionalParams:{},constructor:function(_2bb,_2bc){this.opt=dojo.clone(this.defaultParams);du.updateWithObject(this.opt,_2bc);this.hAxis=this.opt.hAxis;this.vAxis=this.opt.vAxis;this.dirty=true;},clear:function(){this._hAxis=null;this._vAxis=null;this.dirty=true;return this;},setAxis:function(axis){if(axis){this[axis.vertical?"_vAxis":"_hAxis"]=axis;}return this;},addSeries:function(run){return this;},calculateAxes:function(dim){return this;},isDirty:function(){return this.dirty||this._hAxis&&this._hAxis.dirty||this._vAxis&&this._vAxis.dirty;},getRequiredColors:function(){return 0;},render:function(dim,_2bd){this.dirty=this.isDirty();if(!this.dirty){return this;}this.cleanGroup();var s=this.group,ta=this.chart.theme.axis;try{var _2be=this._vAxis.getScaler(),vt=_2be.scaler.getTransformerFromModel(_2be),_2bf=this._vAxis.getTicks();if(this.opt.hMinorLines){dojo.forEach(_2bf.minor,function(tick){var y=dim.height-_2bd.b-vt(tick.value);s.createLine({x1:_2bd.l,y1:y,x2:dim.width-_2bd.r,y2:y}).setStroke(ta.minorTick);});}if(this.opt.hMajorLines){dojo.forEach(_2bf.major,function(tick){var y=dim.height-_2bd.b-vt(tick.value);s.createLine({x1:_2bd.l,y1:y,x2:dim.width-_2bd.r,y2:y}).setStroke(ta.majorTick);});}}catch(e){}try{var _2c0=this._hAxis.getScaler(),ht=_2c0.scaler.getTransformerFromModel(_2c0),_2bf=this._hAxis.getTicks();if(_2bf&&this.opt.vMinorLines){dojo.forEach(_2bf.minor,function(tick){var x=_2bd.l+ht(tick.value);s.createLine({x1:x,y1:_2bd.t,x2:x,y2:dim.height-_2bd.b}).setStroke(ta.minorTick);});}if(_2bf&&this.opt.vMajorLines){dojo.forEach(_2bf.major,function(tick){var x=_2bd.l+ht(tick.value);s.createLine({x1:x,y1:_2bd.t,x2:x,y2:dim.height-_2bd.b}).setStroke(ta.majorTick);});}}catch(e){}this.dirty=false;return this;}});})();}if(!dojo._hasResource["dojox.charting.plot2d.Pie"]){dojo._hasResource["dojox.charting.plot2d.Pie"]=true;dojo.provide("dojox.charting.plot2d.Pie");(function(){var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,da=dojox.charting.axis2d.common,g=dojox.gfx;dojo.declare("dojox.charting.plot2d.Pie",dojox.charting.Element,{defaultParams:{labels:true,ticks:false,fixed:true,precision:1,labelOffset:20,labelStyle:"default",htmlLabels:true},optionalParams:{font:"",fontColor:"",radius:0},constructor:function(_2c1,_2c2){this.opt=dojo.clone(this.defaultParams);du.updateWithObject(this.opt,_2c2);du.updateWithPattern(this.opt,_2c2,this.optionalParams);this.run=null;this.dyn=[];},destroy:function(){this.resetEvents();this.inherited(arguments);},clear:function(){this.dirty=true;this.dyn=[];this.run=null;return this;},setAxis:function(axis){return this;},addSeries:function(run){this.run=run;return this;},calculateAxes:function(dim){return this;},getRequiredColors:function(){return this.run?this.run.data.length:0;},plotEvent:function(o){},connect:function(_2c3,_2c4){this.dirty=true;return dojo.connect(this,"plotEvent",_2c3,_2c4);},events:function(){var ls=this.plotEvent._listeners;if(!ls||!ls.length){return false;}for(var i in ls){if(!(i in Array.prototype)){return true;}}return false;},resetEvents:function(){this.plotEvent({type:"onplotreset",plot:this});},_connectEvents:function(_2c5,o){_2c5.connect("onmouseover",this,function(e){o.type="onmouseover";o.event=e;this.plotEvent(o);});_2c5.connect("onmouseout",this,function(e){o.type="onmouseout";o.event=e;this.plotEvent(o);});_2c5.connect("onclick",this,function(e){o.type="onclick";o.event=e;this.plotEvent(o);});},render:function(dim,_2c6){if(!this.dirty){return this;}this.dirty=false;this.cleanGroup();var s=this.group,_2c7,t=this.chart.theme;this.resetEvents();if(!this.run||!this.run.data.length){return this;}var rx=(dim.width-_2c6.l-_2c6.r)/2,ry=(dim.height-_2c6.t-_2c6.b)/2,r=Math.min(rx,ry),_2c8="font" in this.opt?this.opt.font:t.axis.font,size=_2c8?g.normalizedLength(g.splitFontString(_2c8).size):0,_2c9="fontColor" in this.opt?this.opt.fontColor:t.axis.fontColor,_2ca=0,step,_2cb,_2cc,_2cd,_2ce,_2cf,run=this.run.data,_2d0=this.events();if(typeof run[0]=="number"){_2cb=df.map(run,"Math.max(x, 0)");if(df.every(_2cb,"<= 0")){return this;}_2cc=df.map(_2cb,"/this",df.foldl(_2cb,"+",0));if(this.opt.labels){_2cd=dojo.map(_2cc,function(x){return x>0?this._getLabel(x*100)+"%":"";},this);}}else{_2cb=df.map(run,"Math.max(x.y, 0)");if(df.every(_2cb,"<= 0")){return this;}_2cc=df.map(_2cb,"/this",df.foldl(_2cb,"+",0));if(this.opt.labels){_2cd=dojo.map(_2cc,function(x,i){if(x<=0){return "";}var v=run[i];return "text" in v?v.text:this._getLabel(x*100)+"%";},this);}}if(this.opt.labels){_2ce=df.foldl1(df.map(_2cd,function(_2d1){return dojox.gfx._base._getTextBox(_2d1,{font:_2c8}).w;},this),"Math.max(a, b)")/2;if(this.opt.labelOffset<0){r=Math.min(rx-2*_2ce,ry-size)+this.opt.labelOffset;}_2cf=r-this.opt.labelOffset;}if("radius" in this.opt){r=this.opt.radius;_2cf=r-this.opt.labelOffset;}var _2d2={cx:_2c6.l+rx,cy:_2c6.t+ry,r:r};this.dyn=[];dojo.some(_2cc,function(_2d3,i){if(_2d3<=0){return false;}var v=run[i];if(_2d3>=1){var _2d4,fill,_2d5;if(typeof v=="object"){_2d4="color" in v?v.color:new dojo.Color(t.next("color"));fill="fill" in v?v.fill:dc.augmentFill(t.series.fill,_2d4);_2d5="stroke" in v?v.stroke:dc.augmentStroke(t.series.stroke,_2d4);}else{_2d4=new dojo.Color(t.next("color"));fill=dc.augmentFill(t.series.fill,_2d4);_2d5=dc.augmentStroke(t.series.stroke,_2d4);}var _2d6=s.createCircle(_2d2).setFill(fill).setStroke(_2d5);this.dyn.push({color:_2d4,fill:fill,stroke:_2d5});if(_2d0){var o={element:"slice",index:i,run:this.run,plot:this,shape:_2d6,x:i,y:typeof v=="number"?v:v.y,cx:_2d2.cx,cy:_2d2.cy,cr:r};this._connectEvents(_2d6,o);}return true;}var end=_2ca+_2d3*2*Math.PI;if(i+1==_2cc.length){end=2*Math.PI;}var step=end-_2ca,x1=_2d2.cx+r*Math.cos(_2ca),y1=_2d2.cy+r*Math.sin(_2ca),x2=_2d2.cx+r*Math.cos(end),y2=_2d2.cy+r*Math.sin(end);var _2d4,fill,_2d5;if(typeof v=="object"){_2d4="color" in v?v.color:new dojo.Color(t.next("color"));fill="fill" in v?v.fill:dc.augmentFill(t.series.fill,_2d4);_2d5="stroke" in v?v.stroke:dc.augmentStroke(t.series.stroke,_2d4);}else{_2d4=new dojo.Color(t.next("color"));fill=dc.augmentFill(t.series.fill,_2d4);_2d5=dc.augmentStroke(t.series.stroke,_2d4);}var _2d6=s.createPath({}).moveTo(_2d2.cx,_2d2.cy).lineTo(x1,y1).arcTo(r,r,0,step>Math.PI,true,x2,y2).lineTo(_2d2.cx,_2d2.cy).closePath().setFill(fill).setStroke(_2d5);this.dyn.push({color:_2d4,fill:fill,stroke:_2d5});if(_2d0){var o={element:"slice",index:i,run:this.run,plot:this,shape:_2d6,x:i,y:typeof v=="number"?v:v.y,cx:_2d2.cx,cy:_2d2.cy,cr:r};this._connectEvents(_2d6,o);}_2ca=end;return false;},this);if(this.opt.labels){_2ca=0;dojo.some(_2cc,function(_2d7,i){if(_2d7<=0){return false;}if(_2d7>=1){var v=run[i],elem=da.createText[this.opt.htmlLabels&&dojox.gfx.renderer!="vml"?"html":"gfx"](this.chart,s,_2d2.cx,_2d2.cy+size/2,"middle",_2cd[i],_2c8,(typeof v=="object"&&"fontColor" in v)?v.fontColor:_2c9);if(this.opt.htmlLabels){this.htmlElements.push(elem);}return true;}var end=_2ca+_2d7*2*Math.PI,v=run[i];if(i+1==_2cc.length){end=2*Math.PI;}var _2d8=(_2ca+end)/2,x=_2d2.cx+_2cf*Math.cos(_2d8),y=_2d2.cy+_2cf*Math.sin(_2d8)+size/2;var elem=da.createText[this.opt.htmlLabels&&dojox.gfx.renderer!="vml"?"html":"gfx"](this.chart,s,x,y,"middle",_2cd[i],_2c8,(typeof v=="object"&&"fontColor" in v)?v.fontColor:_2c9);if(this.opt.htmlLabels){this.htmlElements.push(elem);}_2ca=end;return false;},this);}return this;},_getLabel:function(_2d9){return this.opt.fixed?_2d9.toFixed(this.opt.precision):_2d9.toString();}});})();}if(!dojo._hasResource["dojox.charting.plot2d.Bubble"]){dojo._hasResource["dojox.charting.plot2d.Bubble"]=true;dojo.provide("dojox.charting.plot2d.Bubble");(function(){var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_2da=df.lambda("item.purgeGroup()");dojo.declare("dojox.charting.plot2d.Bubble",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y"},optionalParams:{},constructor:function(_2db,_2dc){this.opt=dojo.clone(this.defaultParams);du.updateWithObject(this.opt,_2dc);this.series=[];this.hAxis=this.opt.hAxis;this.vAxis=this.opt.vAxis;},calculateAxes:function(dim){this._calc(dim,dc.collectSimpleStats(this.series));return this;},render:function(dim,_2dd){this.dirty=this.isDirty();if(this.dirty){dojo.forEach(this.series,_2da);this.cleanGroup();var s=this.group;df.forEachRev(this.series,function(item){item.cleanGroup(s);});}var t=this.chart.theme,_2de,_2df,_2e0,_2e1,_2e2,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_2e3=this.events();this.resetEvents();for(var i=this.series.length-1;i>=0;--i){var run=this.series[i];if(!this.dirty&&!run.dirty){continue;}run.cleanGroup();if(!run.data.length){run.dirty=false;continue;}if(typeof run.data[0]=="number"){console.warn("dojox.charting.plot2d.Bubble: the data in the following series cannot be rendered as a bubble chart; ",run);continue;}var s=run.group,_2e4=dojo.map(run.data,function(v,i){return {x:ht(v.x)+_2dd.l,y:dim.height-_2dd.b-vt(v.y),radius:this._vScaler.bounds.scale*(v.size/2)};},this);if(run.fill){_2e0=run.fill;}else{if(run.stroke){_2e0=run.stroke;}else{_2e0=run.dyn.color=new dojo.Color(t.next("color"));}}run.dyn.fill=_2e0;_2de=run.dyn.stroke=run.stroke?dc.makeStroke(run.stroke):dc.augmentStroke(t.series.stroke,_2e0);var _2e5=null,_2e6=null,_2e7=null;if(this.opt.shadows&&_2de){var sh=this.opt.shadows,_2e2=new dojo.Color([0,0,0,0.2]),_2e1=dojo.clone(_2df?_2df:_2de);_2e1.color=_2e2;_2e1.width+=sh.dw?sh.dw:0;run.dyn.shadow=_2e1;var _2e8=dojo.map(_2e4,function(item){var sh=this.opt.shadows;return s.createCircle({cx:item.x+sh.dx,cy:item.y+sh.dy,r:item.radius}).setStroke(_2e1).setFill(_2e2);},this);}if(run.outline||t.series.outline){_2df=dc.makeStroke(run.outline?run.outline:t.series.outline);_2df.width=2*_2df.width+_2de.width;run.dyn.outline=_2df;_2e6=dojo.map(_2e4,function(item){s.createCircle({cx:item.x,cy:item.y,r:item.radius}).setStroke(_2df);},this);}_2e5=dojo.map(_2e4,function(item){return s.createCircle({cx:item.x,cy:item.y,r:item.radius}).setStroke(_2de).setFill(_2e0);},this);if(_2e3){dojo.forEach(_2e5,function(s,i){var o={element:"circle",index:i,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:s,outline:_2e6&&_2e6[i]||null,shadow:_2e7&&_2e7[i]||null,x:run.data[i].x,y:run.data[i].y,r:run.data[i].size/2,cx:_2e4[i].x,cy:_2e4[i].y,cr:_2e4[i].radius};this._connectEvents(s,o);},this);}run.dirty=false;}this.dirty=false;return this;}});})();}if(!dojo._hasResource["dojox.charting.plot2d.Candlesticks"]){dojo._hasResource["dojox.charting.plot2d.Candlesticks"]=true;dojo.provide("dojox.charting.plot2d.Candlesticks");(function(){var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_2e9=df.lambda("item.purgeGroup()");dojo.declare("dojox.charting.plot2d.Candlesticks",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",gap:2,shadows:null},optionalParams:{minBarSize:1,maxBarSize:1},constructor:function(_2ea,_2eb){this.opt=dojo.clone(this.defaultParams);du.updateWithObject(this.opt,_2eb);du.updateWithPattern(this.opt,_2eb,this.optionalParams);this.series=[];this.hAxis=this.opt.hAxis;this.vAxis=this.opt.vAxis;},collectStats:function(_2ec){var _2ed=dojo.clone(dc.defaultStats);for(var i=0;i<_2ec.length;i++){var run=_2ec[i];if(!run.data.length){continue;}var _2ee=_2ed.vmin,_2ef=_2ed.vmax;if(!("ymin" in run)||!("ymax" in run)){dojo.forEach(run.data,function(val,idx){var x=val.x||idx+1;_2ed.hmin=Math.min(_2ed.hmin,x);_2ed.hmax=Math.max(_2ed.hmax,x);_2ed.vmin=Math.min(_2ed.vmin,val.open,val.close,val.high,val.low);_2ed.vmax=Math.max(_2ed.vmax,val.open,val.close,val.high,val.low);});}if("ymin" in run){_2ed.vmin=Math.min(_2ee,run.ymin);}if("ymax" in run){_2ed.vmax=Math.max(_2ef,run.ymax);}}return _2ed;},calculateAxes:function(dim){var _2f0=this.collectStats(this.series),t;_2f0.hmin-=0.5;_2f0.hmax+=0.5;this._calc(dim,_2f0);return this;},render:function(dim,_2f1){this.dirty=this.isDirty();if(this.dirty){dojo.forEach(this.series,_2e9);this.cleanGroup();var s=this.group;df.forEachRev(this.series,function(item){item.cleanGroup(s);});}var t=this.chart.theme,_2f2,_2f3,fill,f,gap,_2f4,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_2f5=Math.max(0,this._vScaler.bounds.lower),_2f6=vt(_2f5),_2f7=this.events();f=dc.calculateBarSize(this._hScaler.bounds.scale,this.opt);gap=f.gap;_2f4=f.size;this.resetEvents();for(var i=this.series.length-1;i>=0;--i){var run=this.series[i];if(!this.dirty&&!run.dirty){continue;}run.cleanGroup();var s=run.group;if(!run.fill||!run.stroke){_2f2=run.dyn.color=new dojo.Color(t.next("color"));}_2f3=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_2f2);fill=run.fill?run.fill:dc.augmentFill(t.series.fill,_2f2);for(var j=0;j<run.data.length;++j){var v=run.data[j];var x=ht(v.x||(j+0.5))+_2f1.l+gap,y=dim.height-_2f1.b,open=vt(v.open),_2f8=vt(v.close),high=vt(v.high),low=vt(v.low);if("mid" in v){var mid=vt(v.mid);}if(low>high){var tmp=high;high=low;low=tmp;}if(_2f4>=1){var _2f9=open>_2f8;var line={x1:_2f4/2,x2:_2f4/2,y1:y-high,y2:y-low},rect={x:0,y:y-Math.max(open,_2f8),width:_2f4,height:Math.max(_2f9?open-_2f8:_2f8-open,1)};shape=s.createGroup();shape.setTransform({dx:x,dy:0});var _2fa=shape.createGroup();_2fa.createLine(line).setStroke(_2f3);_2fa.createRect(rect).setStroke(_2f3).setFill(_2f9?fill:"white");if("mid" in v){_2fa.createLine({x1:(_2f3.width||1),x2:_2f4-(_2f3.width||1),y1:y-mid,y2:y-mid}).setStroke(_2f9?{color:"white"}:_2f3);}run.dyn.fill=fill;run.dyn.stroke=_2f3;if(_2f7){var o={element:"candlestick",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_2fa,x:x,y:y-Math.max(open,_2f8),cx:_2f4/2,cy:(y-Math.max(open,_2f8))+(Math.max(_2f9?open-_2f8:_2f8-open,1)/2),width:_2f4,height:Math.max(_2f9?open-_2f8:_2f8-open,1),data:v};this._connectEvents(shape,o);}}}run.dirty=false;}this.dirty=false;return this;}});})();}if(!dojo._hasResource["dojox.charting.plot2d.OHLC"]){dojo._hasResource["dojox.charting.plot2d.OHLC"]=true;dojo.provide("dojox.charting.plot2d.OHLC");(function(){var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_2fb=df.lambda("item.purgeGroup()");dojo.declare("dojox.charting.plot2d.OHLC",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",gap:2,shadows:null},optionalParams:{minBarSize:1,maxBarSize:1},constructor:function(_2fc,_2fd){this.opt=dojo.clone(this.defaultParams);du.updateWithObject(this.opt,_2fd);du.updateWithPattern(this.opt,_2fd,this.optionalParams);this.series=[];this.hAxis=this.opt.hAxis;this.vAxis=this.opt.vAxis;},collectStats:function(_2fe){var _2ff=dojo.clone(dc.defaultStats);for(var i=0;i<_2fe.length;i++){var run=_2fe[i];if(!run.data.length){continue;}var _300=_2ff.vmin,_301=_2ff.vmax;if(!("ymin" in run)||!("ymax" in run)){dojo.forEach(run.data,function(val,idx){var x=val.x||idx+1;_2ff.hmin=Math.min(_2ff.hmin,x);_2ff.hmax=Math.max(_2ff.hmax,x);_2ff.vmin=Math.min(_2ff.vmin,val.open,val.close,val.high,val.low);_2ff.vmax=Math.max(_2ff.vmax,val.open,val.close,val.high,val.low);});}if("ymin" in run){_2ff.vmin=Math.min(_300,run.ymin);}if("ymax" in run){_2ff.vmax=Math.max(_301,run.ymax);}}return _2ff;},calculateAxes:function(dim){var _302=this.collectStats(this.series),t;_302.hmin-=0.5;_302.hmax+=0.5;this._calc(dim,_302);return this;},render:function(dim,_303){this.dirty=this.isDirty();if(this.dirty){dojo.forEach(this.series,_2fb);this.cleanGroup();var s=this.group;df.forEachRev(this.series,function(item){item.cleanGroup(s);});}var t=this.chart.theme,_304,_305,fill,f,gap,_306,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_307=Math.max(0,this._vScaler.bounds.lower),_308=vt(_307),_309=this.events();f=dc.calculateBarSize(this._hScaler.bounds.scale,this.opt);gap=f.gap;_306=f.size;this.resetEvents();for(var i=this.series.length-1;i>=0;--i){var run=this.series[i];if(!this.dirty&&!run.dirty){continue;}run.cleanGroup();var s=run.group;if(!run.fill||!run.stroke){_304=run.dyn.color=new dojo.Color(t.next("color"));}_305=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_304);fill=run.fill?run.fill:dc.augmentFill(t.series.fill,_304);for(var j=0;j<run.data.length;++j){var v=run.data[j];var x=ht(v.x||(j+0.5))+_303.l+gap,y=dim.height-_303.b,open=vt(v.open),_30a=vt(v.close),high=vt(v.high),low=vt(v.low);if(low>high){var tmp=high;high=low;low=tmp;}if(_306>=1){var hl={x1:_306/2,x2:_306/2,y1:y-high,y2:y-low},op={x1:0,x2:((_306/2)+((_305.width||1)/2)),y1:y-open,y2:y-open},cl={x1:((_306/2)-((_305.width||1)/2)),x2:_306,y1:y-_30a,y2:y-_30a};shape=s.createGroup();shape.setTransform({dx:x,dy:0});var _30b=shape.createGroup();_30b.createLine(hl).setStroke(_305);_30b.createLine(op).setStroke(_305);_30b.createLine(cl).setStroke(_305);run.dyn.fill=fill;run.dyn.stroke=_305;if(_309){var o={element:"candlestick",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_30b,x:x,y:y-Math.max(open,_30a),cx:_306/2,cy:(y-Math.max(open,_30a))+(Math.max(open>_30a?open-_30a:_30a-open,1)/2),width:_306,height:Math.max(open>_30a?open-_30a:_30a-open,1),data:v};this._connectEvents(shape,o);}}}run.dirty=false;}this.dirty=false;return this;}});})();}if(!dojo._hasResource["dojox.charting.Chart2D"]){dojo._hasResource["dojox.charting.Chart2D"]=true;dojo.provide("dojox.charting.Chart2D");(function(){var df=dojox.lang.functional,dc=dojox.charting,_30c=df.lambda("item.clear()"),_30d=df.lambda("item.purgeGroup()"),_30e=df.lambda("item.destroy()"),_30f=df.lambda("item.dirty = false"),_310=df.lambda("item.dirty = true");dojo.declare("dojox.charting.Chart2D",null,{constructor:function(node,_311){if(!_311){_311={};}this.margins=_311.margins?_311.margins:{l:10,t:10,r:10,b:10};this.stroke=_311.stroke;this.fill=_311.fill;this.theme=null;this.axes={};this.stack=[];this.plots={};this.series=[];this.runs={};this.dirty=true;this.coords=null;this.node=dojo.byId(node);var box=dojo.marginBox(node);this.surface=dojox.gfx.createSurface(this.node,box.w,box.h);},destroy:function(){dojo.forEach(this.series,_30e);dojo.forEach(this.stack,_30e);df.forIn(this.axes,_30e);this.surface.destroy();},getCoords:function(){if(!this.coords){this.coords=dojo.coords(this.node,true);}return this.coords;},setTheme:function(_312){this.theme=_312._clone();this.dirty=true;return this;},addAxis:function(name,_313){var axis;if(!_313||!("type" in _313)){axis=new dc.axis2d.Default(this,_313);}else{axis=typeof _313.type=="string"?new dc.axis2d[_313.type](this,_313):new _313.type(this,_313);}axis.name=name;axis.dirty=true;if(name in this.axes){this.axes[name].destroy();}this.axes[name]=axis;this.dirty=true;return this;},getAxis:function(name){return this.axes[name];},removeAxis:function(name){if(name in this.axes){this.axes[name].destroy();delete this.axes[name];this.dirty=true;}return this;},addPlot:function(name,_314){var plot;if(!_314||!("type" in _314)){plot=new dc.plot2d.Default(this,_314);}else{plot=typeof _314.type=="string"?new dc.plot2d[_314.type](this,_314):new _314.type(this,_314);}plot.name=name;plot.dirty=true;if(name in this.plots){this.stack[this.plots[name]].destroy();this.stack[this.plots[name]]=plot;}else{this.plots[name]=this.stack.length;this.stack.push(plot);}this.dirty=true;return this;},removePlot:function(name){if(name in this.plots){var _315=this.plots[name];delete this.plots[name];this.stack[_315].destroy();this.stack.splice(_315,1);df.forIn(this.plots,function(idx,name,_316){if(idx>_315){_316[name]=idx-1;}});this.dirty=true;}return this;},addSeries:function(name,data,_317){var run=new dc.Series(this,data,_317);if(name in this.runs){this.series[this.runs[name]].destroy();this.series[this.runs[name]]=run;}else{this.runs[name]=this.series.length;this.series.push(run);}run.name=name;this.dirty=true;if(!("ymin" in run)&&"min" in run){run.ymin=run.min;}if(!("ymax" in run)&&"max" in run){run.ymax=run.max;}return this;},removeSeries:function(name){if(name in this.runs){var _318=this.runs[name],_319=this.series[_318].plot;delete this.runs[name];this.series[_318].destroy();this.series.splice(_318,1);df.forIn(this.runs,function(idx,name,runs){if(idx>_318){runs[name]=idx-1;}});this.dirty=true;}return this;},updateSeries:function(name,data){if(name in this.runs){var run=this.series[this.runs[name]];run.data=data;run.dirty=true;this._invalidateDependentPlots(run.plot,false);this._invalidateDependentPlots(run.plot,true);}return this;},resize:function(_31a,_31b){var box;switch(arguments.length){case 0:box=dojo.marginBox(this.node);break;case 1:box=_31a;break;default:box={w:_31a,h:_31b};break;}dojo.marginBox(this.node,box);this.surface.setDimensions(box.w,box.h);this.dirty=true;this.coords=null;return this.render();},getGeometry:function(){var ret={};df.forIn(this.axes,function(axis){if(axis.initialized()){ret[axis.name]={name:axis.name,vertical:axis.vertical,scaler:axis.scaler,ticks:axis.ticks};}});return ret;},setAxisWindow:function(name,_31c,_31d){var axis=this.axes[name];if(axis){axis.setWindow(_31c,_31d);}return this;},setWindow:function(sx,sy,dx,dy){if(!("plotArea" in this)){this.calculateGeometry();}df.forIn(this.axes,function(axis){var _31e,_31f,_320=axis.getScaler().bounds,s=_320.span/(_320.upper-_320.lower);if(axis.vertical){_31e=sy;_31f=dy/s/_31e;}else{_31e=sx;_31f=dx/s/_31e;}axis.setWindow(_31e,_31f);});return this;},calculateGeometry:function(){if(this.dirty){return this.fullGeometry();}dojo.forEach(this.stack,function(plot){if(plot.dirty||(plot.hAxis&&this.axes[plot.hAxis].dirty)||(plot.vAxis&&this.axes[plot.vAxis].dirty)){plot.calculateAxes(this.plotArea);}},this);return this;},fullGeometry:function(){this._makeDirty();dojo.forEach(this.stack,_30c);if(!this.theme){this.setTheme(new dojox.charting.Theme(dojox.charting._def));}dojo.forEach(this.series,function(run){if(!(run.plot in this.plots)){var plot=new dc.plot2d.Default(this,{});plot.name=run.plot;this.plots[run.plot]=this.stack.length;this.stack.push(plot);}this.stack[this.plots[run.plot]].addSeries(run);},this);dojo.forEach(this.stack,function(plot){if(plot.hAxis){plot.setAxis(this.axes[plot.hAxis]);}if(plot.vAxis){plot.setAxis(this.axes[plot.vAxis]);}},this);var dim=this.dim=this.surface.getDimensions();dim.width=dojox.gfx.normalizedLength(dim.width);dim.height=dojox.gfx.normalizedLength(dim.height);df.forIn(this.axes,_30c);dojo.forEach(this.stack,function(p){p.calculateAxes(dim);});var _321=this.offsets={l:0,r:0,t:0,b:0};df.forIn(this.axes,function(axis){df.forIn(axis.getOffsets(),function(o,i){_321[i]+=o;});});df.forIn(this.margins,function(o,i){_321[i]+=o;});this.plotArea={width:dim.width-_321.l-_321.r,height:dim.height-_321.t-_321.b};df.forIn(this.axes,_30c);dojo.forEach(this.stack,function(plot){plot.calculateAxes(this.plotArea);},this);return this;},render:function(){if(this.theme){this.theme.clear();}if(this.dirty){return this.fullRender();}this.calculateGeometry();df.forEachRev(this.stack,function(plot){plot.render(this.dim,this.offsets);},this);df.forIn(this.axes,function(axis){axis.render(this.dim,this.offsets);},this);this._makeClean();if(this.surface.render){this.surface.render();}return this;},fullRender:function(){this.fullGeometry();var _322=this.offsets,dim=this.dim;var _323=df.foldl(this.stack,"z + plot.getRequiredColors()",0);this.theme.defineColors({num:_323,cache:false});dojo.forEach(this.series,_30d);df.forIn(this.axes,_30d);dojo.forEach(this.stack,_30d);this.surface.clear();var t=this.theme,fill=t.plotarea&&t.plotarea.fill,_324=t.plotarea&&t.plotarea.stroke;if(fill){this.surface.createRect({x:_322.l,y:_322.t,width:dim.width-_322.l-_322.r,height:dim.height-_322.t-_322.b}).setFill(fill);}if(_324){this.surface.createRect({x:_322.l,y:_322.t,width:dim.width-_322.l-_322.r-1,height:dim.height-_322.t-_322.b-1}).setStroke(_324);}df.foldr(this.stack,function(z,plot){return plot.render(dim,_322),0;},0);fill=this.fill?this.fill:(t.chart&&t.chart.fill);_324=this.stroke?this.stroke:(t.chart&&t.chart.stroke);if(fill=="inherit"){var node=this.node,fill=new dojo.Color(dojo.style(node,"backgroundColor"));while(fill.a==0&&node!=document.documentElement){fill=new dojo.Color(dojo.style(node,"backgroundColor"));node=node.parentNode;}}if(fill){if(_322.l){this.surface.createRect({width:_322.l,height:dim.height+1}).setFill(fill);}if(_322.r){this.surface.createRect({x:dim.width-_322.r,width:_322.r+1,height:dim.height+1}).setFill(fill);}if(_322.t){this.surface.createRect({width:dim.width+1,height:_322.t}).setFill(fill);}if(_322.b){this.surface.createRect({y:dim.height-_322.b,width:dim.width+1,height:_322.b+2}).setFill(fill);}}if(_324){this.surface.createRect({width:dim.width-1,height:dim.height-1}).setStroke(_324);}df.forIn(this.axes,function(axis){axis.render(dim,_322);});this._makeClean();if(this.surface.render){this.surface.render();}return this;},connectToPlot:function(name,_325,_326){return name in this.plots?this.stack[this.plots[name]].connect(_325,_326):null;},_makeClean:function(){dojo.forEach(this.axes,_30f);dojo.forEach(this.stack,_30f);dojo.forEach(this.series,_30f);this.dirty=false;},_makeDirty:function(){dojo.forEach(this.axes,_310);dojo.forEach(this.stack,_310);dojo.forEach(this.series,_310);this.dirty=true;},_invalidateDependentPlots:function(_327,_328){if(_327 in this.plots){var plot=this.stack[this.plots[_327]],axis,_329=_328?"vAxis":"hAxis";if(plot[_329]){axis=this.axes[plot[_329]];if(axis&&axis.dependOnData()){axis.dirty=true;dojo.forEach(this.stack,function(p){if(p[_329]&&p[_329]==plot[_329]){p.dirty=true;}});}}else{plot.dirty=true;}}}});})();}if(!dojo._hasResource["dojo.fx.easing"]){dojo._hasResource["dojo.fx.easing"]=true;dojo.provide("dojo.fx.easing");dojo.fx.easing={linear:function(n){return n;},quadIn:function(n){return Math.pow(n,2);},quadOut:function(n){return n*(n-2)*-1;},quadInOut:function(n){n=n*2;if(n<1){return Math.pow(n,2)/2;}return -1*((--n)*(n-2)-1)/2;},cubicIn:function(n){return Math.pow(n,3);},cubicOut:function(n){return Math.pow(n-1,3)+1;},cubicInOut:function(n){n=n*2;if(n<1){return Math.pow(n,3)/2;}n-=2;return (Math.pow(n,3)+2)/2;},quartIn:function(n){return Math.pow(n,4);},quartOut:function(n){return -1*(Math.pow(n-1,4)-1);},quartInOut:function(n){n=n*2;if(n<1){return Math.pow(n,4)/2;}n-=2;return -1/2*(Math.pow(n,4)-2);},quintIn:function(n){return Math.pow(n,5);},quintOut:function(n){return Math.pow(n-1,5)+1;},quintInOut:function(n){n=n*2;if(n<1){return Math.pow(n,5)/2;}n-=2;return (Math.pow(n,5)+2)/2;},sineIn:function(n){return -1*Math.cos(n*(Math.PI/2))+1;},sineOut:function(n){return Math.sin(n*(Math.PI/2));},sineInOut:function(n){return -1*(Math.cos(Math.PI*n)-1)/2;},expoIn:function(n){return (n==0)?0:Math.pow(2,10*(n-1));},expoOut:function(n){return (n==1)?1:(-1*Math.pow(2,-10*n)+1);},expoInOut:function(n){if(n==0){return 0;}if(n==1){return 1;}n=n*2;if(n<1){return Math.pow(2,10*(n-1))/2;}--n;return (-1*Math.pow(2,-10*n)+2)/2;},circIn:function(n){return -1*(Math.sqrt(1-Math.pow(n,2))-1);},circOut:function(n){n=n-1;return Math.sqrt(1-Math.pow(n,2));},circInOut:function(n){n=n*2;if(n<1){return -1/2*(Math.sqrt(1-Math.pow(n,2))-1);}n-=2;return 1/2*(Math.sqrt(1-Math.pow(n,2))+1);},backIn:function(n){var s=1.70158;return Math.pow(n,2)*((s+1)*n-s);},backOut:function(n){n=n-1;var s=1.70158;return Math.pow(n,2)*((s+1)*n+s)+1;},backInOut:function(n){var s=1.70158*1.525;n=n*2;if(n<1){return (Math.pow(n,2)*((s+1)*n-s))/2;}n-=2;return (Math.pow(n,2)*((s+1)*n+s)+2)/2;},elasticIn:function(n){if(n==0||n==1){return n;}var p=0.3;var s=p/4;n=n-1;return -1*Math.pow(2,10*n)*Math.sin((n-s)*(2*Math.PI)/p);},elasticOut:function(n){if(n==0||n==1){return n;}var p=0.3;var s=p/4;return Math.pow(2,-10*n)*Math.sin((n-s)*(2*Math.PI)/p)+1;},elasticInOut:function(n){if(n==0){return 0;}n=n*2;if(n==2){return 1;}var p=0.3*1.5;var s=p/4;if(n<1){n-=1;return -0.5*(Math.pow(2,10*n)*Math.sin((n-s)*(2*Math.PI)/p));}n-=1;return 0.5*(Math.pow(2,-10*n)*Math.sin((n-s)*(2*Math.PI)/p))+1;},bounceIn:function(n){return (1-dojo.fx.easing.bounceOut(1-n));},bounceOut:function(n){var s=7.5625;var p=2.75;var l;if(n<(1/p)){l=s*Math.pow(n,2);}else{if(n<(2/p)){n-=(1.5/p);l=s*Math.pow(n,2)+0.75;}else{if(n<(2.5/p)){n-=(2.25/p);l=s*Math.pow(n,2)+0.9375;}else{n-=(2.625/p);l=s*Math.pow(n,2)+0.984375;}}}return l;},bounceInOut:function(n){if(n<0.5){return dojo.fx.easing.bounceIn(n*2)/2;}return (dojo.fx.easing.bounceOut(n*2-1)/2)+0.5;}};}if(!dojo._hasResource["dojox.charting.action2d.Base"]){dojo._hasResource["dojox.charting.action2d.Base"]=true;dojo.provide("dojox.charting.action2d.Base");(function(){var _32a=400,_32b=dojo.fx.easing.backOut,df=dojox.lang.functional;dojo.declare("dojox.charting.action2d.Base",null,{overOutEvents:{onmouseover:1,onmouseout:1},constructor:function(_32c,plot,_32d){this.chart=_32c;this.plot=plot?plot:"default";this.anim={};if(!_32d){_32d={};}this.duration=_32d.duration?_32d.duration:_32a;this.easing=_32d.easing?_32d.easing:_32b;},connect:function(){this.handle=this.chart.connectToPlot(this.plot,this,"process");},disconnect:function(){if(this.handle){dojo.disconnect(this.handle);this.handle=null;}},reset:function(){},destroy:function(){if(this.handle){this.disconnect();}df.forIn(this.anim,function(o){df.forIn(o,function(anim){anim.action.stop(true);});});this.anim={};}});})();}if(!dojo._hasResource["dojox.charting.action2d.Highlight"]){dojo._hasResource["dojox.charting.action2d.Highlight"]=true;dojo.provide("dojox.charting.action2d.Highlight");(function(){var _32e=100,_32f=75,_330=50,c=dojox.color,cc=function(_331){return function(){return _331;};},hl=function(_332){var a=new c.Color(_332),x=a.toHsl();if(x.s==0){x.l=x.l<50?100:0;}else{x.s=_32e;if(x.l<_330){x.l=_32f;}else{if(x.l>_32f){x.l=_330;}else{x.l=x.l-_330>_32f-x.l?_330:_32f;}}}return c.fromHsl(x);};dojo.declare("dojox.charting.action2d.Highlight",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut},optionalParams:{highlight:"red"},constructor:function(_333,plot,_334){var a=_334&&_334.highlight;this.colorFun=a?(dojo.isFunction(a)?a:cc(a)):hl;this.connect();},process:function(o){if(!o.shape||!(o.type in this.overOutEvents)){return;}var _335=o.run.name,_336=o.index,anim,_337,_338;if(_335 in this.anim){anim=this.anim[_335][_336];}else{this.anim[_335]={};}if(anim){anim.action.stop(true);}else{var _339=o.shape.getFill();if(!_339||!(_339 instanceof dojo.Color)){return;}this.anim[_335][_336]=anim={start:_339,end:this.colorFun(_339)};}var _33a=anim.start,end=anim.end;if(o.type=="onmouseout"){var t=_33a;_33a=end;end=t;}anim.action=dojox.gfx.fx.animateFill({shape:o.shape,duration:this.duration,easing:this.easing,color:{start:_33a,end:end}});if(o.type=="onmouseout"){dojo.connect(anim.action,"onEnd",this,function(){if(this.anim[_335]){delete this.anim[_335][_336];}});}anim.action.play();}});})();}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(args){var _33b=this;dojo.mixin(_33b,args);_33b.node=args.node;_33b._showArgs=dojo.mixin({},args);_33b._showArgs.node=_33b.node;_33b._showArgs.duration=_33b.showDuration;_33b.showAnim=_33b.showFunc(_33b._showArgs);_33b._hideArgs=dojo.mixin({},args);_33b._hideArgs.node=_33b.node;_33b._hideArgs.duration=_33b.hideDuration;_33b.hideAnim=_33b.hideFunc(_33b._hideArgs);dojo.connect(_33b.showAnim,"beforeBegin",dojo.hitch(_33b.hideAnim,"stop",true));dojo.connect(_33b.hideAnim,"beforeBegin",dojo.hitch(_33b.showAnim,"stop",true));},show:function(_33c){return this.showAnim.play(_33c||0);},hide:function(_33d){return this.hideAnim.play(_33d||0);}});}if(!dojo._hasResource["dojo.fx"]){dojo._hasResource["dojo.fx"]=true;dojo.provide("dojo.fx");(function(){var d=dojo,_33e={_fire:function(evt,args){if(this[evt]){this[evt].apply(this,args||[]);}return this;}};var _33f=function(_340){this._index=-1;this._animations=_340||[];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(_33f,{_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(_341,_342){if(!this._current){this._current=this._animations[this._index=0];}if(!_342&&this._current.status()=="playing"){return this;}var _343=d.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_344=d.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_345=d.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);d.disconnect(_343);d.disconnect(_344);d.disconnect(_345);});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(_346,_347){this.pause();var _348=this.duration*_346;this._current=null;d.some(this._animations,function(a){if(a.duration<=_348){this._current=a;return true;}_348-=a.duration;return false;});if(this._current){this._current.gotoPercent(_348/this._current.duration,_347);}return this;},stop:function(_349){if(this._current){if(_349){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(_33f,_33e);dojo.fx.chain=function(_34a){return new _33f(_34a);};var _34b=function(_34c){this._animations=_34c||[];this._connects=[];this._finished=0;this.duration=0;d.forEach(_34c,function(a){var _34d=a.duration;if(a.delay){_34d+=a.delay;}if(this.duration<_34d){this.duration=_34d;}this._connects.push(d.connect(a,"onEnd",this,"_onEnd"));},this);this._pseudoAnimation=new d.Animation({curve:[0,1],duration:this.duration});var self=this;d.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop","onEnd"],function(evt){self._connects.push(d.connect(self._pseudoAnimation,evt,function(){self._fire(evt,arguments);}));});};d.extend(_34b,{_doAction:function(_34e,args){d.forEach(this._animations,function(a){a[_34e].apply(a,args);});return this;},_onEnd:function(){if(++this._finished>this._animations.length){this._fire("onEnd");}},_call:function(_34f,args){var t=this._pseudoAnimation;t[_34f].apply(t,args);},play:function(_350,_351){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(_352,_353){var ms=this.duration*_352;d.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_353);});this._call("gotoPercent",arguments);return this;},stop:function(_354){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(_34b,_33e);dojo.fx.combine=function(_355){return new _34b(_355);};dojo.fx.wipeIn=function(args){var node=args.node=d.byId(args.node),s=node.style,o;var anim=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 _356=d.style(node,"height");return Math.max(_356,1);}},end:function(){return node.scrollHeight;}}}},args));d.connect(anim,"onEnd",function(){s.height="auto";s.overflow=o;});return anim;};dojo.fx.wipeOut=function(args){var node=args.node=d.byId(args.node),s=node.style,o;var anim=d.animateProperty(d.mixin({properties:{height:{end:1}}},args));d.connect(anim,"beforeBegin",function(){o=s.overflow;s.overflow="hidden";s.display="";});d.connect(anim,"onEnd",function(){s.overflow=o;s.height="auto";s.display="none";});return anim;};dojo.fx.slideTo=function(args){var node=args.node=d.byId(args.node),top=null,left=null;var init=(function(n){return function(){var cs=d.getComputedStyle(n);var pos=cs.position;top=(pos=="absolute"?n.offsetTop:parseInt(cs.top)||0);left=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);if(pos!="absolute"&&pos!="relative"){var ret=d.position(n,true);top=ret.y;left=ret.x;n.style.position="absolute";n.style.top=top+"px";n.style.left=left+"px";}};})(node);init();var anim=d.animateProperty(d.mixin({properties:{top:args.top||0,left:args.left||0}},args));d.connect(anim,"beforeBegin",anim,init);return anim;};})();}if(!dojo._hasResource["dojox.charting.action2d.Magnify"]){dojo._hasResource["dojox.charting.action2d.Magnify"]=true;dojo.provide("dojox.charting.action2d.Magnify");(function(){var _357=2,m=dojox.gfx.matrix,gf=dojox.gfx.fx;dojo.declare("dojox.charting.action2d.Magnify",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut,scale:_357},optionalParams:{},constructor:function(_358,plot,_359){this.scale=_359&&typeof _359.scale=="number"?_359.scale:_357;this.connect();},process:function(o){if(!o.shape||!(o.type in this.overOutEvents)||!("cx" in o)||!("cy" in o)){return;}var _35a=o.run.name,_35b=o.index,_35c=[],anim,init,_35d;if(_35a in this.anim){anim=this.anim[_35a][_35b];}else{this.anim[_35a]={};}if(anim){anim.action.stop(true);}else{this.anim[_35a][_35b]=anim={};}if(o.type=="onmouseover"){init=m.identity;_35d=this.scale;}else{init=m.scaleAt(this.scale,o.cx,o.cy);_35d=1/this.scale;}var _35e={shape:o.shape,duration:this.duration,easing:this.easing,transform:[{name:"scaleAt",start:[1,o.cx,o.cy],end:[_35d,o.cx,o.cy]},init]};if(o.shape){_35c.push(gf.animateTransform(_35e));}if(o.oultine){_35e.shape=o.outline;_35c.push(gf.animateTransform(_35e));}if(o.shadow){_35e.shape=o.shadow;_35c.push(gf.animateTransform(_35e));}if(!_35c.length){delete this.anim[_35a][_35b];return;}anim.action=dojo.fx.combine(_35c);if(o.type=="onmouseout"){dojo.connect(anim.action,"onEnd",this,function(){if(this.anim[_35a]){delete this.anim[_35a][_35b];}});}anim.action.play();}});})();}if(!dojo._hasResource["dojox.lang.functional.scan"]){dojo._hasResource["dojox.lang.functional.scan"]=true;dojo.provide("dojox.lang.functional.scan");(function(){var d=dojo,df=dojox.lang.functional,_35f={};d.mixin(df,{scanl:function(a,f,z,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var t,n,i;if(d.isArray(a)){t=new Array((n=a.length)+1);t[0]=z;for(i=0;i<n;z=f.call(o,z,a[i],i,a),t[++i]=z){}}else{if(typeof a.hasNext=="function"&&typeof a.next=="function"){t=[z];for(i=0;a.hasNext();t.push(z=f.call(o,z,a.next(),i++,a))){}}else{t=[z];for(i in a){if(!(i in _35f)){t.push(z=f.call(o,z,a[i],i,a));}}}}return t;},scanl1:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var t,n,z,_360=true;if(d.isArray(a)){t=new Array(n=a.length);t[0]=z=a[0];for(var i=1;i<n;t[i]=z=f.call(o,z,a[i],i,a),++i){}}else{if(typeof a.hasNext=="function"&&typeof a.next=="function"){if(a.hasNext()){t=[z=a.next()];for(var i=1;a.hasNext();t.push(z=f.call(o,z,a.next(),i++,a))){}}}else{for(var i in a){if(!(i in _35f)){if(_360){t=[z=a[i]];_360=false;}else{t.push(z=f.call(o,z,a[i],i,a));}}}}}return t;},scanr:function(a,f,z,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var n=a.length,t=new Array(n+1),i=n;t[n]=z;for(;i>0;--i,z=f.call(o,z,a[i],i,a),t[i]=z){}return t;},scanr1:function(a,f,o){if(typeof a=="string"){a=a.split("");}o=o||d.global;f=df.lambda(f);var n=a.length,t=new Array(n),z=a[n-1],i=n-1;t[i]=z;for(;i>0;--i,z=f.call(o,z,a[i],i,a),t[i]=z){}return t;}});})();}if(!dojo._hasResource["dojox.charting.action2d.MoveSlice"]){dojo._hasResource["dojox.charting.action2d.MoveSlice"]=true;dojo.provide("dojox.charting.action2d.MoveSlice");(function(){var _361=1.05,_362=7,m=dojox.gfx.matrix,gf=dojox.gfx.fx,df=dojox.lang.functional;dojo.declare("dojox.charting.action2d.MoveSlice",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut,scale:_361,shift:_362},optionalParams:{},constructor:function(_363,plot,_364){if(!_364){_364={};}this.scale=typeof _364.scale=="number"?_364.scale:_361;this.shift=typeof _364.shift=="number"?_364.shift:_362;this.connect();},process:function(o){if(!o.shape||o.element!="slice"||!(o.type in this.overOutEvents)){return;}if(!this.angles){if(typeof o.run.data[0]=="number"){this.angles=df.map(df.scanl(o.run.data,"+",0),"* 2 * Math.PI / this",df.foldl(o.run.data,"+",0));}else{this.angles=df.map(df.scanl(o.run.data,"a + b.y",0),"* 2 * Math.PI / this",df.foldl(o.run.data,"a + b.y",0));}}var _365=o.index,anim,_366,_367,_368,_369,_36a=(this.angles[_365]+this.angles[_365+1])/2,_36b=m.rotateAt(-_36a,o.cx,o.cy),_36c=m.rotateAt(_36a,o.cx,o.cy);anim=this.anim[_365];if(anim){anim.action.stop(true);}else{this.anim[_365]=anim={};}if(o.type=="onmouseover"){_368=0;_369=this.shift;_366=1;_367=this.scale;}else{_368=this.shift;_369=0;_366=this.scale;_367=1;}anim.action=dojox.gfx.fx.animateTransform({shape:o.shape,duration:this.duration,easing:this.easing,transform:[_36c,{name:"translate",start:[_368,0],end:[_369,0]},{name:"scaleAt",start:[_366,o.cx,o.cy],end:[_367,o.cx,o.cy]},_36b]});if(o.type=="onmouseout"){dojo.connect(anim.action,"onEnd",this,function(){delete this.anim[_365];});}anim.action.play();},reset:function(){delete this.angles;}});})();}if(!dojo._hasResource["dojox.charting.action2d.Shake"]){dojo._hasResource["dojox.charting.action2d.Shake"]=true;dojo.provide("dojox.charting.action2d.Shake");(function(){var _36d=3,m=dojox.gfx.matrix,gf=dojox.gfx.fx;dojo.declare("dojox.charting.action2d.Shake",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut,shiftX:_36d,shiftY:_36d},optionalParams:{},constructor:function(_36e,plot,_36f){if(!_36f){_36f={};}this.shiftX=typeof _36f.shiftX=="number"?_36f.shiftX:_36d;this.shiftY=typeof _36f.shiftY=="number"?_36f.shiftY:_36d;this.connect();},process:function(o){if(!o.shape||!(o.type in this.overOutEvents)){return;}var _370=o.run.name,_371=o.index,_372=[],anim,_373=o.type=="onmouseover"?this.shiftX:-this.shiftX,_374=o.type=="onmouseover"?this.shiftY:-this.shiftY;if(_370 in this.anim){anim=this.anim[_370][_371];}else{this.anim[_370]={};}if(anim){anim.action.stop(true);}else{this.anim[_370][_371]=anim={};}var _375={shape:o.shape,duration:this.duration,easing:this.easing,transform:[{name:"translate",start:[this.shiftX,this.shiftY],end:[0,0]},m.identity]};if(o.shape){_372.push(gf.animateTransform(_375));}if(o.oultine){_375.shape=o.outline;_372.push(gf.animateTransform(_375));}if(o.shadow){_375.shape=o.shadow;_372.push(gf.animateTransform(_375));}if(!_372.length){delete this.anim[_370][_371];return;}anim.action=dojo.fx.combine(_372);if(o.type=="onmouseout"){dojo.connect(anim.action,"onEnd",this,function(){if(this.anim[_370]){delete this.anim[_370][_371];}});}anim.action.play();}});})();}if(!dojo._hasResource["dojo.date.stamp"]){dojo._hasResource["dojo.date.stamp"]=true;dojo.provide("dojo.date.stamp");dojo.date.stamp.fromISOString=function(_376,_377){if(!dojo.date.stamp._isoRegExp){dojo.date.stamp._isoRegExp=/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;}var _378=dojo.date.stamp._isoRegExp.exec(_376),_379=null;if(_378){_378.shift();if(_378[1]){_378[1]--;}if(_378[6]){_378[6]*=1000;}if(_377){_377=new Date(_377);dojo.map(["FullYear","Month","Date","Hours","Minutes","Seconds","Milliseconds"],function(prop){return _377["get"+prop]();}).forEach(function(_37a,_37b){if(_378[_37b]===undefined){_378[_37b]=_37a;}});}_379=new Date(_378[0]||1970,_378[1]||0,_378[2]||1,_378[3]||0,_378[4]||0,_378[5]||0,_378[6]||0);if(_378[0]<100){_379.setFullYear(_378[0]||1970);}var _37c=0,_37d=_378[7]&&_378[7].charAt(0);if(_37d!="Z"){_37c=((_378[8]||0)*60)+(Number(_378[9])||0);if(_37d!="-"){_37c*=-1;}}if(_37d){_37c-=_379.getTimezoneOffset();}if(_37c){_379.setTime(_379.getTime()+_37c*60000);}}return _379;};dojo.date.stamp.toISOString=function(_37e,_37f){var _380=function(n){return (n<10)?"0"+n:n;};_37f=_37f||{};var _381=[],_382=_37f.zulu?"getUTC":"get",date="";if(_37f.selector!="time"){var year=_37e[_382+"FullYear"]();date=["0000".substr((year+"").length)+year,_380(_37e[_382+"Month"]()+1),_380(_37e[_382+"Date"]())].join("-");}_381.push(date);if(_37f.selector!="date"){var time=[_380(_37e[_382+"Hours"]()),_380(_37e[_382+"Minutes"]()),_380(_37e[_382+"Seconds"]())].join(":");var _383=_37e[_382+"Milliseconds"]();if(_37f.milliseconds){time+="."+(_383<100?"0":"")+_380(_383);}if(_37f.zulu){time+="Z";}else{if(_37f.selector!="time"){var _384=_37e.getTimezoneOffset();var _385=Math.abs(_384);time+=(_384>0?"-":"+")+_380(Math.floor(_385/60))+":"+_380(_385%60);}}_381.push(time);}return _381.join("T");};}if(!dojo._hasResource["dojo.parser"]){dojo._hasResource["dojo.parser"]=true;dojo.provide("dojo.parser");dojo.parser=new function(){var d=dojo;this._attrName=d._scopeName+"Type";this._query="["+this._attrName+"]";function _386(_387){if(d.isString(_387)){return "string";}if(typeof _387=="number"){return "number";}if(typeof _387=="boolean"){return "boolean";}if(d.isFunction(_387)){return "function";}if(d.isArray(_387)){return "array";}if(_387 instanceof Date){return "date";}if(_387 instanceof d._Url){return "url";}return "object";};function _388(_389,type){switch(type){case "string":return _389;case "number":return _389.length?Number(_389):NaN;case "boolean":return typeof _389=="boolean"?_389:!(_389.toLowerCase()=="false");case "function":if(d.isFunction(_389)){_389=_389.toString();_389=d.trim(_389.substring(_389.indexOf("{")+1,_389.length-1));}try{if(_389.search(/[^\w\.]+/i)!=-1){return new Function(_389);}else{return d.getObject(_389,false);}}catch(e){return new Function();}case "array":return _389?_389.split(/\s*,\s*/):[];case "date":switch(_389){case "":return new Date("");case "now":return new Date();default:return d.date.stamp.fromISOString(_389);}case "url":return d.baseUrl+_389;default:return d.fromJson(_389);}};var _38a={};dojo.connect(dojo,"extend",function(){_38a={};});function _38b(_38c){if(!_38a[_38c]){var cls=d.getObject(_38c);if(!d.isFunction(cls)){throw new Error("Could not load class '"+_38c+"'. Did you spell the name correctly and use a full path, like 'dijit.form.Button'?");}var _38d=cls.prototype;var _38e={},_38f={};for(var name in _38d){if(name.charAt(0)=="_"){continue;}if(name in _38f){continue;}var _390=_38d[name];_38e[name]=_386(_390);}_38a[_38c]={cls:cls,params:_38e};}return _38a[_38c];};this._functionFromScript=function(_391){var _392="";var _393="";var _394=_391.getAttribute("args");if(_394){d.forEach(_394.split(/\s*,\s*/),function(part,idx){_392+="var "+part+" = arguments["+idx+"]; ";});}var _395=_391.getAttribute("with");if(_395&&_395.length){d.forEach(_395.split(/\s*,\s*/),function(part){_392+="with("+part+"){";_393+="}";});}return new Function(_392+_391.innerHTML+_393);};this.instantiate=function(_396,_397,args){var _398=[],dp=dojo.parser;_397=_397||{};args=args||{};d.forEach(_396,function(node){if(!node){return;}var type=dp._attrName in _397?_397[dp._attrName]:node.getAttribute(dp._attrName);if(!type||!type.length){return;}var _399=_38b(type),_39a=_399.cls,ps=_39a._noScript||_39a.prototype._noScript;var _39b={},_39c=node.attributes;for(var name in _399.params){var item=name in _397?{value:_397[name],specified:true}:_39c.getNamedItem(name);if(!item||(!item.specified&&(!dojo.isIE||name.toLowerCase()!="value"))){continue;}var _39d=item.value;switch(name){case "class":_39d="className" in _397?_397.className:node.className;break;case "style":_39d="style" in _397?_397.style:(node.style&&node.style.cssText);}var _39e=_399.params[name];if(typeof _39d=="string"){_39b[name]=_388(_39d,_39e);}else{_39b[name]=_39d;}}if(!ps){var _39f=[],_3a0=[];d.query("> script[type^='dojo/']",node).orphan().forEach(function(_3a1){var _3a2=_3a1.getAttribute("event"),type=_3a1.getAttribute("type"),nf=d.parser._functionFromScript(_3a1);if(_3a2){if(type=="dojo/connect"){_39f.push({event:_3a2,func:nf});}else{_39b[_3a2]=nf;}}else{_3a0.push(nf);}});}var _3a3=_39a.markupFactory||_39a.prototype&&_39a.prototype.markupFactory;var _3a4=_3a3?_3a3(_39b,node,_39a):new _39a(_39b,node);_398.push(_3a4);var _3a5=node.getAttribute("jsId");if(_3a5){d.setObject(_3a5,_3a4);}if(!ps){d.forEach(_39f,function(_3a6){d.connect(_3a4,_3a6.event,null,_3a6.func);});d.forEach(_3a0,function(func){func.call(_3a4);});}});if(!_397._started){d.forEach(_398,function(_3a7){if(!args.noStart&&_3a7&&_3a7.startup&&!_3a7._started&&(!_3a7.getParent||!_3a7.getParent())){_3a7.startup();}});}return _398;};this.parse=function(_3a8,args){var root;if(!args&&_3a8&&_3a8.rootNode){args=_3a8;root=args.rootNode;}else{root=_3a8;}var list=d.query(this._query,root);return this.instantiate(list,null,args);};}();(function(){var _3a9=function(){if(dojo.config.parseOnLoad){dojo.parser.parse();}};if(dojo.exists("dijit.wai.onload")&&(dijit.wai.onload===dojo._loaders[0])){dojo._loaders.splice(1,0,_3a9);}else{dojo._loaders.unshift(_3a9);}})();}if(!dojo._hasResource["dojo.cache"]){dojo._hasResource["dojo.cache"]=true;dojo.provide("dojo.cache");(function(){var _3aa={};dojo.cache=function(_3ab,url,_3ac){if(typeof _3ab=="string"){var _3ad=dojo.moduleUrl(_3ab,url);}else{_3ad=_3ab;_3ac=url;}var key=_3ad.toString();var val=_3ac;if(_3ac!==undefined&&!dojo.isString(_3ac)){val=("value" in _3ac?_3ac.value:undefined);}var _3ae=_3ac&&_3ac.sanitize?true:false;if(val||val===null){if(val==null){delete _3aa[key];}else{val=_3aa[key]=_3ae?dojo.cache._sanitize(val):val;}}else{if(!(key in _3aa)){val=dojo._getText(key);_3aa[key]=_3ae?dojo.cache._sanitize(val):val;}val=_3aa[key];}return val;};dojo.cache._sanitize=function(val){if(val){val=val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _3af=val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_3af){val=_3af[1];}}else{val="";}return val;};})();}if(!dojo._hasResource["dijit._Templated"]){dojo._hasResource["dijit._Templated"]=true;dojo.provide("dijit._Templated");dojo.declare("dijit._Templated",null,{templateString:null,templatePath:null,widgetsInTemplate:false,_skipNodeCache:false,_earlyTemplatedStartup:false,constructor:function(){this._attachPoints=[];},_stringRepl:function(tmpl){var _3b0=this.declaredClass,_3b1=this;return dojo.string.substitute(tmpl,this,function(_3b2,key){if(key.charAt(0)=="!"){_3b2=dojo.getObject(key.substr(1),false,_3b1);}if(typeof _3b2=="undefined"){throw new Error(_3b0+" template:"+key);}if(_3b2==null){return "";}return key.charAt(0)=="!"?_3b2:_3b2.toString().replace(/"/g,"&quot;");},this);},buildRendering:function(){var _3b3=dijit._Templated.getCachedTemplate(this.templatePath,this.templateString,this._skipNodeCache);var node;if(dojo.isString(_3b3)){node=dojo._toDom(this._stringRepl(_3b3));if(node.nodeType!=1){throw new Error("Invalid template: "+_3b3);}}else{node=_3b3.cloneNode(true);}this.domNode=node;this._attachTemplateNodes(node);if(this.widgetsInTemplate){var _3b4=dojo.parser,qry,attr;if(_3b4._query!="[dojoType]"){qry=_3b4._query;attr=_3b4._attrName;_3b4._query="[dojoType]";_3b4._attrName="dojoType";}var cw=(this._startupWidgets=dojo.parser.parse(node,{noStart:!this._earlyTemplatedStartup}));if(qry){_3b4._query=qry;_3b4._attrName=attr;}this._supportingWidgets=dijit.findWidgets(node);this._attachTemplateNodes(cw,function(n,p){return n[p];});}this._fillContent(this.srcNodeRef);},_fillContent:function(_3b5){var dest=this.containerNode;if(_3b5&&dest){while(_3b5.hasChildNodes()){dest.appendChild(_3b5.firstChild);}}},_attachTemplateNodes:function(_3b6,_3b7){_3b7=_3b7||function(n,p){return n.getAttribute(p);};var _3b8=dojo.isArray(_3b6)?_3b6:(_3b6.all||_3b6.getElementsByTagName("*"));var x=dojo.isArray(_3b6)?0:-1;for(;x<_3b8.length;x++){var _3b9=(x==-1)?_3b6:_3b8[x];if(this.widgetsInTemplate&&_3b7(_3b9,"dojoType")){continue;}var _3ba=_3b7(_3b9,"dojoAttachPoint");if(_3ba){var _3bb,_3bc=_3ba.split(/\s*,\s*/);while((_3bb=_3bc.shift())){if(dojo.isArray(this[_3bb])){this[_3bb].push(_3b9);}else{this[_3bb]=_3b9;}this._attachPoints.push(_3bb);}}var _3bd=_3b7(_3b9,"dojoAttachEvent");if(_3bd){var _3be,_3bf=_3bd.split(/\s*,\s*/);var trim=dojo.trim;while((_3be=_3bf.shift())){if(_3be){var _3c0=null;if(_3be.indexOf(":")!=-1){var _3c1=_3be.split(":");_3be=trim(_3c1[0]);_3c0=trim(_3c1[1]);}else{_3be=trim(_3be);}if(!_3c0){_3c0=_3be;}this.connect(_3b9,_3be,_3c0);}}}var role=_3b7(_3b9,"waiRole");if(role){dijit.setWaiRole(_3b9,role);}var _3c2=_3b7(_3b9,"waiState");if(_3c2){dojo.forEach(_3c2.split(/\s*,\s*/),function(_3c3){if(_3c3.indexOf("-")!=-1){var pair=_3c3.split("-");dijit.setWaiState(_3b9,pair[0],pair[1]);}});}}},startup:function(){dojo.forEach(this._startupWidgets,function(w){if(w&&!w._started&&w.startup){w.startup();}});this.inherited(arguments);},destroyRendering:function(){dojo.forEach(this._attachPoints,function(_3c4){delete this[_3c4];},this);this._attachPoints=[];this.inherited(arguments);}});dijit._Templated._templateCache={};dijit._Templated.getCachedTemplate=function(_3c5,_3c6,_3c7){var _3c8=dijit._Templated._templateCache;var key=_3c6||_3c5;var _3c9=_3c8[key];if(_3c9){try{if(!_3c9.ownerDocument||_3c9.ownerDocument==dojo.doc){return _3c9;}}catch(e){}dojo.destroy(_3c9);}if(!_3c6){_3c6=dojo.cache(_3c5,{sanitize:true});}_3c6=dojo.string.trim(_3c6);if(_3c7||_3c6.match(/\$\{([^\}]+)\}/g)){return (_3c8[key]=_3c6);}else{var node=dojo._toDom(_3c6);if(node.nodeType!=1){throw new Error("Invalid template: "+_3c6);}return (_3c8[key]=node);}};if(dojo.isIE){dojo.addOnWindowUnload(function(){var _3ca=dijit._Templated._templateCache;for(var key in _3ca){var _3cb=_3ca[key];if(typeof _3cb=="object"){dojo.destroy(_3cb);}delete _3ca[key];}});}dojo.extend(dijit._Widget,{dojoAttachEvent:"",dojoAttachPoint:"",waiRole:"",waiState:""});}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(_3cc,_3cd,_3ce){if(this.aroundNode&&this.aroundNode===_3cd){return;}if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_3cc;this.domNode.style.top=(this.domNode.offsetTop+1)+"px";var pos=dijit.placeOnScreenAroundElement(this.domNode,_3cd,dijit.getPopupAroundAlignment((_3ce&&_3ce.length)?_3ce:dijit.Tooltip.defaultPosition,this.isLeftToRight()),dojo.hitch(this,"orient"));dojo.style(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_3cd;},orient:function(node,_3cf,_3d0){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"}[_3cf+"-"+_3d0];},_onShow:function(){if(dojo.isIE){this.domNode.style.filter="";}},hide:function(_3d1){if(this._onDeck&&this._onDeck[1]==_3d1){this._onDeck=null;}else{if(this.aroundNode===_3d1){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(_3d2,_3d3,_3d4){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.show(_3d2,_3d3,_3d4);};dijit.hideTooltip=function(_3d5){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.hide(_3d5);};dojo.declare("dijit.Tooltip",dijit._Widget,{label:"",showDelay:400,connectId:[],position:[],constructor:function(){this._nodeConnectionsById={};},_setConnectIdAttr:function(_3d6){for(var _3d7 in this._nodeConnectionsById){this.removeTarget(_3d7);}dojo.forEach(dojo.isArrayLike(_3d6)?_3d6:[_3d6],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 _3d8=e.target;this._showTimer=setTimeout(dojo.hitch(this,function(){this.open(_3d8);}),this.showDelay);}},_onUnHover:function(e){if(this._focus){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}this.close();},open:function(_3d9){if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}dijit.showTooltip(this.label||this.domNode.innerHTML,_3d9,this.position);this._connectNode=_3d9;this.onShow(_3d9,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(_3da,_3db){},onHide:function(){},uninitialize:function(){this.close();this.inherited(arguments);}});dijit.Tooltip.defaultPosition=["after","before"];}if(!dojo._hasResource["dojox.charting.action2d.Tooltip"]){dojo._hasResource["dojox.charting.action2d.Tooltip"]=true;dojo.provide("dojox.charting.action2d.Tooltip");(function(){var _3dc=function(o){var t=o.run&&o.run.data&&o.run.data[o.index];if(t&&typeof t!="number"&&(t.tooltip||t.text)){return t.tooltip||t.text;}if(o.element=="candlestick"){return "<table cellpadding=\"1\" cellspacing=\"0\" border=\"0\" style=\"font-size:0.9em;\">"+"<tr><td>Open:</td><td align=\"right\"><strong>"+o.data.open+"</strong></td></tr>"+"<tr><td>High:</td><td align=\"right\"><strong>"+o.data.high+"</strong></td></tr>"+"<tr><td>Low:</td><td align=\"right\"><strong>"+o.data.low+"</strong></td></tr>"+"<tr><td>Close:</td><td align=\"right\"><strong>"+o.data.close+"</strong></td></tr>"+(o.data.mid!==undefined?"<tr><td>Mid:</td><td align=\"right\"><strong>"+o.data.mid+"</strong></td></tr>":"")+"</table>";}return o.element=="bar"?o.x:o.y;};var df=dojox.lang.functional,pi4=Math.PI/4,pi2=Math.PI/2;dojo.declare("dojox.charting.action2d.Tooltip",dojox.charting.action2d.Base,{defaultParams:{text:_3dc},optionalParams:{},constructor:function(_3dd,plot,_3de){this.text=_3de&&_3de.text?_3de.text:_3dc;this.connect();},process:function(o){if(o.type==="onplotreset"||o.type==="onmouseout"){dijit.hideTooltip(this.aroundRect);this.aroundRect=null;return;}if(!o.shape||o.type!=="onmouseover"){return;}var _3df={type:"rect"},_3e0=["after","before"];switch(o.element){case "marker":_3df.x=o.cx;_3df.y=o.cy;_3df.width=_3df.height=1;break;case "circle":_3df.x=o.cx-o.cr;_3df.y=o.cy-o.cr;_3df.width=_3df.height=2*o.cr;break;case "column":_3e0=["above","below"];case "bar":_3df=dojo.clone(o.shape.getShape());break;case "candlestick":_3df.x=o.x;_3df.y=o.y;_3df.width=o.width;_3df.height=o.height;break;default:if(!this.angles){if(typeof o.run.data[0]=="number"){this.angles=df.map(df.scanl(o.run.data,"+",0),"* 2 * Math.PI / this",df.foldl(o.run.data,"+",0));}else{this.angles=df.map(df.scanl(o.run.data,"a + b.y",0),"* 2 * Math.PI / this",df.foldl(o.run.data,"a + b.y",0));}}var _3e1=(this.angles[o.index]+this.angles[o.index+1])/2;_3df.x=o.cx+o.cr*Math.cos(_3e1);_3df.y=o.cy+o.cr*Math.sin(_3e1);_3df.width=_3df.height=1;if(_3e1<pi4){}else{if(_3e1<pi2+pi4){_3e0=["below","above"];}else{if(_3e1<Math.PI+pi4){_3e0=["before","after"];}else{if(_3e1<2*Math.PI-pi4){_3e0=["above","below"];}}}}break;}var lt=dojo.coords(this.chart.node,true);_3df.x+=lt.x;_3df.y+=lt.y;_3df.x=Math.round(_3df.x);_3df.y=Math.round(_3df.y);_3df.width=Math.ceil(_3df.width);_3df.height=Math.ceil(_3df.height);this.aroundRect=_3df;dijit.showTooltip(this.text(o),this.aroundRect,_3e0);}});})();}if(!dojo._hasResource["dojox.charting.widget.Chart2D"]){dojo._hasResource["dojox.charting.widget.Chart2D"]=true;dojo.provide("dojox.charting.widget.Chart2D");(function(){var _3e2,_3e3,_3e4,_3e5,_3e6,_3e7=function(o){return o;},df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting,d=dojo;dojo.declare("dojox.charting.widget.Chart2D",dijit._Widget,{theme:null,margins:null,stroke:null,fill:null,buildRendering:function(){var n=this.domNode=this.srcNodeRef;var axes=d.query("> .axis",n).map(_3e3).filter(_3e7),_3e8=d.query("> .plot",n).map(_3e4).filter(_3e7),_3e9=d.query("> .action",n).map(_3e5).filter(_3e7),_3ea=d.query("> .series",n).map(_3e6).filter(_3e7);n.innerHTML="";var c=this.chart=new dc.Chart2D(n,{margins:this.margins,stroke:this.stroke,fill:this.fill});if(this.theme){c.setTheme(this.theme);}axes.forEach(function(axis){c.addAxis(axis.name,axis.kwArgs);});_3e8.forEach(function(plot){c.addPlot(plot.name,plot.kwArgs);});this.actions=_3e9.map(function(_3eb){return new _3eb.action(c,_3eb.plot,_3eb.kwArgs);});var _3ec=df.foldl(_3ea,function(_3ed,_3ee){if(_3ee.type=="data"){c.addSeries(_3ee.name,_3ee.data,_3ee.kwArgs);_3ed=true;}else{c.addSeries(_3ee.name,[0],_3ee.kwArgs);var kw={};du.updateWithPattern(kw,_3ee.kwArgs,{"query":"","queryOptions":null,"start":0,"count":1},true);if(_3ee.kwArgs.sort){kw.sort=dojo.clone(_3ee.kwArgs.sort);}d.mixin(kw,{onComplete:function(data){var _3ef;if("valueFn" in _3ee.kwArgs){var fn=_3ee.kwArgs.valueFn;_3ef=d.map(data,function(x){return fn(_3ee.data.getValue(x,_3ee.field,0));});}else{_3ef=d.map(data,function(x){return _3ee.data.getValue(x,_3ee.field,0);});}c.addSeries(_3ee.name,_3ef,_3ee.kwArgs).render();}});_3ee.data.fetch(kw);}return _3ed;},false);if(_3ec){c.render();}},destroy:function(){this.chart.destroy();this.inherited(arguments);},resize:function(box){if(box.w>0&&box.h>0){dojo.marginBox(this.domNode,box);this.chart.resize();}}});_3e2=function(node,type,kw){var dp=eval("("+type+".prototype.defaultParams)");var x,attr;for(x in dp){if(x in kw){continue;}attr=node.getAttribute(x);kw[x]=du.coerceType(dp[x],attr==null||typeof attr=="undefined"?dp[x]:attr);}var op=eval("("+type+".prototype.optionalParams)");for(x in op){if(x in kw){continue;}attr=node.getAttribute(x);if(attr!=null){kw[x]=du.coerceType(op[x],attr);}}};_3e3=function(node){var name=node.getAttribute("name"),type=node.getAttribute("type");if(!name){return null;}var o={name:name,kwArgs:{}},kw=o.kwArgs;if(type){if(dc.axis2d[type]){type=dojox._scopeName+".charting.axis2d."+type;}var axis=eval("("+type+")");if(axis){kw.type=axis;}}else{type=dojox._scopeName+".charting.axis2d.Default";}_3e2(node,type,kw);return o;};_3e4=function(node){var name=node.getAttribute("name"),type=node.getAttribute("type");if(!name){return null;}var o={name:name,kwArgs:{}},kw=o.kwArgs;if(type){if(dc.plot2d[type]){type=dojox._scopeName+".charting.plot2d."+type;}var plot=eval("("+type+")");if(plot){kw.type=plot;}}else{type=dojox._scopeName+".charting.plot2d.Default";}_3e2(node,type,kw);return o;};_3e5=function(node){var plot=node.getAttribute("plot"),type=node.getAttribute("type");if(!plot){plot="default";}var o={plot:plot,kwArgs:{}},kw=o.kwArgs;if(type){if(dc.action2d[type]){type=dojox._scopeName+".charting.action2d."+type;}var _3f0=eval("("+type+")");if(!_3f0){return null;}o.action=_3f0;}else{return null;}_3e2(node,type,kw);return o;};_3e6=function(node){var ga=d.partial(d.attr,node);var name=ga("name");if(!name){return null;}var o={name:name,kwArgs:{}},kw=o.kwArgs,t;t=ga("plot");if(t!=null){kw.plot=t;}t=ga("marker");if(t!=null){kw.marker=t;}t=ga("stroke");if(t!=null){kw.stroke=eval("("+t+")");}t=ga("fill");if(t!=null){kw.fill=eval("("+t+")");}t=ga("legend");if(t!=null){kw.legend=t;}t=ga("data");if(t!=null){o.type="data";o.data=dojo.map(String(t).split(","),Number);return o;}t=ga("array");if(t!=null){o.type="data";o.data=eval("("+t+")");return o;}t=ga("store");if(t!=null){o.type="store";o.data=eval("("+t+")");t=ga("field");o.field=t!=null?t:"value";t=ga("query");if(!!t){kw.query=t;}t=ga("queryOptions");if(!!t){kw.queryOptions=eval("("+t+")");}t=ga("start");if(!!t){kw.start=Number(t);}t=ga("count");if(!!t){kw.count=Number(t);}t=ga("sort");if(!!t){kw.sort=eval("("+t+")");}t=ga("valueFn");if(!!t){kw.valueFn=df.lambda(t);}return o;}return null;};})();}if(!dojo._hasResource["dojox.charting.themes.ET.greys"]){dojo._hasResource["dojox.charting.themes.ET.greys"]=true;dojo.provide("dojox.charting.themes.ET.greys");dojo.deprecated("dojox.charting.themes.ET.greys","1.3");(function(){var dxc=dojox.charting;dxc.themes.ET.greys=new dxc.Theme({antiAlias:false,chart:{stroke:null,fill:"inherit"},plotarea:{stroke:null,fill:"transparent"},axis:{stroke:{width:0},line:{width:0},majorTick:{color:"#666666",width:1,length:5},minorTick:{color:"black",width:0.5,length:2},font:"normal normal normal 8pt Tahoma",fontColor:"#999999"},series:{outline:{width:0,color:"black"},stroke:{width:1,color:"black"},fill:dojo.colorFromHex("#3b444b"),font:"normal normal normal 7pt Tahoma",fontColor:"#717171"},marker:{stroke:{width:1},fill:"#333",font:"normal normal normal 7pt Tahoma",fontColor:"#000"},colors:[dojo.colorFromHex("#8a8c8f"),dojo.colorFromHex("#4b4b4b"),dojo.colorFromHex("#3b444b"),dojo.colorFromHex("#2e2d30"),dojo.colorFromHex("#000000")]});})();}if(!dojo._hasResource["dojox.charting.widget.Sparkline"]){dojo._hasResource["dojox.charting.widget.Sparkline"]=true;dojo.provide("dojox.charting.widget.Sparkline");(function(){var d=dojo;dojo.declare("dojox.charting.widget.Sparkline",dojox.charting.widget.Chart2D,{theme:dojox.charting.themes.ET.greys,margins:{l:0,r:0,t:0,b:0},type:"Lines",valueFn:"Number(x)",store:"",field:"",query:"",queryOptions:"",start:"0",count:"Infinity",sort:"",data:"",name:"default",buildRendering:function(){var n=this.srcNodeRef;if(!n.childNodes.length||!d.query("> .axis, > .plot, > .action, > .series",n).length){var plot=document.createElement("div");d.attr(plot,{"class":"plot","name":"default","type":this.type});n.appendChild(plot);var _3f1=document.createElement("div");d.attr(_3f1,{"class":"series",plot:"default",name:this.name,start:this.start,count:this.count,valueFn:this.valueFn});d.forEach(["store","field","query","queryOptions","sort","data"],function(i){if(this[i].length){d.attr(_3f1,i,this[i]);}},this);n.appendChild(_3f1);}this.inherited(arguments);}});})();}if(!dojo._hasResource["dojox.charting.widget.Legend"]){dojo._hasResource["dojox.charting.widget.Legend"]=true;dojo.provide("dojox.charting.widget.Legend");dojo.declare("dojox.charting.widget.Legend",[dijit._Widget,dijit._Templated],{chartRef:"",horizontal:true,swatchSize:18,templateString:"<table dojoAttachPoint='legendNode' class='dojoxLegendNode'><tbody dojoAttachPoint='legendBody'></tbody></table>",legendNode:null,legendBody:null,postCreate:function(){if(!this.chart){if(!this.chartRef){return;}this.chart=dijit.byId(this.chartRef);if(!this.chart){var node=dojo.byId(this.chartRef);if(node){this.chart=dijit.byNode(node);}else{return;}}this.series=this.chart.chart.series;}else{this.series=this.chart.series;}this.refresh();},refresh:function(){var df=dojox.lang.functional;if(this._surfaces){dojo.forEach(this._surfaces,function(_3f2){_3f2.destroy();});}this._surfaces=[];while(this.legendBody.lastChild){dojo.destroy(this.legendBody.lastChild);}if(this.horizontal){dojo.addClass(this.legendNode,"dojoxLegendHorizontal");this._tr=dojo.doc.createElement("tr");this.legendBody.appendChild(this._tr);}var s=this.series;if(s.length==0){return;}if(s[0].chart.stack[0].declaredClass=="dojox.charting.plot2d.Pie"){var t=s[0].chart.stack[0];if(typeof t.run.data[0]=="number"){var _3f3=df.map(t.run.data,"Math.max(x, 0)");if(df.every(_3f3,"<= 0")){return;}var _3f4=df.map(_3f3,"/this",df.foldl(_3f3,"+",0));dojo.forEach(_3f4,function(x,i){this._addLabel(t.dyn[i],t._getLabel(x*100)+"%");},this);}else{dojo.forEach(t.run.data,function(x,i){this._addLabel(t.dyn[i],x.legend||x.text||x.y);},this);}}else{dojo.forEach(s,function(x){this._addLabel(x.dyn,x.legend||x.name);},this);}},_addLabel:function(dyn,_3f5){var icon=dojo.doc.createElement("td"),text=dojo.doc.createElement("td"),div=dojo.doc.createElement("div");dojo.addClass(icon,"dojoxLegendIcon");dojo.addClass(text,"dojoxLegendText");div.style.width=this.swatchSize+"px";div.style.height=this.swatchSize+"px";icon.appendChild(div);if(this._tr){this._tr.appendChild(icon);this._tr.appendChild(text);}else{var tr=dojo.doc.createElement("tr");this.legendBody.appendChild(tr);tr.appendChild(icon);tr.appendChild(text);}this._makeIcon(div,dyn);text.innerHTML=String(_3f5);},_makeIcon:function(div,dyn){var mb={h:this.swatchSize,w:this.swatchSize};var _3f6=dojox.gfx.createSurface(div,mb.w,mb.h);this._surfaces.push(_3f6);if(dyn.fill){_3f6.createRect({x:2,y:2,width:mb.w-4,height:mb.h-4}).setFill(dyn.fill).setStroke(dyn.stroke);}else{if(dyn.stroke||dyn.marker){var line={x1:0,y1:mb.h/2,x2:mb.w,y2:mb.h/2};if(dyn.stroke){_3f6.createLine(line).setStroke(dyn.stroke);}if(dyn.marker){var c={x:mb.w/2,y:mb.h/2};if(dyn.stroke){_3f6.createPath({path:"M"+c.x+" "+c.y+" "+dyn.marker}).setFill(dyn.stroke.color).setStroke(dyn.stroke);}else{_3f6.createPath({path:"M"+c.x+" "+c.y+" "+dyn.marker}).setFill(dyn.color).setStroke(dyn.color);}}}else{_3f6.createRect({x:2,y:2,width:mb.w-4,height:mb.h-4}).setStroke("black");_3f6.createLine({x1:2,y1:2,x2:mb.w-2,y2:mb.h-2}).setStroke("black");_3f6.createLine({x1:2,y1:mb.h-2,x2:mb.w-2,y2:2}).setStroke("black");}}}});}
