hledger-web 0.16 → 0.16.1
raw patch · 12 files changed
+5540/−17 lines, 12 filesdep ~hledgerdep ~hledger-libbinary-added
Dependency ranges changed: hledger, hledger-lib
Files
- Hledger/Web/Settings.hs +2/−8
- hledger-web.cabal +23/−9
- static/combo_select.gif binary
- static/dhtmlxcombo.js +1359/−0
- static/dhtmlxcommon.js +940/−0
- static/excanvas.min.js +1/−0
- static/favicon.ico binary
- static/hledger.js +177/−0
- static/jquery.flot.js +2599/−0
- static/jquery.js +154/−0
- static/jquery.url.js +1/−0
- static/style.css +284/−0
Hledger/Web/Settings.hs view
@@ -22,7 +22,6 @@ , defbaseurl , hledgerorgurl , manualurl- -- , datadir ) where @@ -106,12 +105,7 @@ -- | The location of static files on your system. This is a file system -- path. The default value works properly with your scaffolded site. staticDir :: FilePath---staticDir = "static"-staticDir = datadir++"static"--datadir :: FilePath-datadir = "./"--- datadir = "./.hledger/web/"+staticDir = "static" -- | The base URL for your static files. As you can see by the default -- value, this can simply be "static" appended to your application root.@@ -148,7 +142,7 @@ -- | expects a root folder for each type, e.g: hamlet/ lucius/ julius/ globFile :: String -> String -> FilePath -- globFile kind x = kind ++ "/" ++ x ++ "." ++ kind-globFile kind x = datadir ++ "templates/" ++ x ++ "." ++ kind+globFile kind x = "templates/" ++ x ++ "." ++ kind hamletFile :: FilePath -> Q Exp hamletFile = S.hamletFile . globFile "hamlet"
hledger-web.cabal view
@@ -1,5 +1,5 @@ name: hledger-web-version: 0.16+version: 0.16.1 category: Finance synopsis: A web interface for the hledger accounting tool. description: @@ -22,19 +22,31 @@ build-type: Simple extra-tmp-files: extra-source-files:--- data-dir: --- data-files: + static/style.css+ static/hledger.js+ static/jquery.js+ static/jquery.url.js+ static/jquery.flot.js+ static/dhtmlxcommon.js+ static/dhtmlxcombo.js+ static/excanvas.min.js+ static/combo_select.gif+ static/favicon.ico source-repository head type: darcs location: http://joyful.com/repos/hledger Flag production- Description: Build in production mode, with web files embedded. Otherwise, they will be loaded from ./static/.+ Description: Build fully optimised and with web files embedded (not loaded from ./static/) Default: True +flag threaded+ Description: Build with support for multithreaded execution+ Default: True+ Flag devel- Description: Build for use with "yesod devel".+ Description: Build for auto-recompiling by "yesod devel" Default: False executable hledger-web@@ -43,9 +55,11 @@ Buildable: False if flag(production) cpp-options: -DPRODUCTION- ghc-options: -Wall -threaded -O2+ ghc-options: -O2 else- ghc-options: -W -threaded+ ghc-options: -Wall+ if flag(threaded)+ ghc-options: -threaded other-modules: Hledger.Web Hledger.Web.Foundation@@ -55,8 +69,8 @@ Hledger.Web.Settings.StaticFiles Hledger.Web.Handlers build-depends:- hledger == 0.16- ,hledger-lib == 0.16+ hledger == 0.16.1+ ,hledger-lib == 0.16.1 ,HUnit ,base >= 4 && < 5 ,bytestring
+ static/combo_select.gif view
binary file changed (absent → 309 bytes)
+ static/dhtmlxcombo.js view
@@ -0,0 +1,1359 @@+//v.2.6 build 100722++/* +Copyright DHTMLX LTD. http://www.dhtmlx.com +You allowed to use this component or parts of it under GPL terms +To use it on other terms or get Professional edition of the component please contact us at sales@dhtmlx.com +*/+ +/*_TOPICS_ +@0:Initialization +@1:Selection control +@2:Add/delete +@3:Reserved +@4:Methods of Option object +*/ + +/** +* Build combobox from existing select control. +* +* +* @param parent {string} id of existing select control +* @param size {int } size of control, optional +* @return {object} combobox object +* @type public +* @topic 0 +* +*/ + +function dhtmlXComboFromSelect(parent,size){ + if (typeof(parent)=="string") + parent=document.getElementById(parent); + + + size=size||parent.getAttribute("width")||(window.getComputedStyle?window.getComputedStyle(parent,null)["width"]:(parent.currentStyle?parent.currentStyle["width"]:0)); + if ((!size)||(size=="auto")) + size=parent.offsetWidth||100; + + var z=document.createElement("SPAN"); + + + + parent.parentNode.insertBefore(z,parent); + parent.style.display='none'; + + var s_type = parent.getAttribute('opt_type'); + + var w= new dhtmlXCombo(z,parent.name,size,s_type,parent.tabIndex); + + var x=new Array(); + var sel=0; + for (var i=0; i<parent.options.length; i++){ + if (parent.options[i].selected) sel=i; + var label=parent.options[i].innerHTML; + var val=parent.options[i].getAttribute("value"); + if ((typeof(val)=="undefined")||(val===null)) val=label; + x[i]={value:val,text:label,img_src:parent.options[i].getAttribute("img_src")}; + } + if(x.length) + w.addOption(x); + + + parent.parentNode.removeChild(parent); + w.selectOption(sel,null,true); + if (parent.onchange) + w.attachEvent("onChange",parent.onchange); + + if(parent.style.direction=="rtl" && w.setRTL) + w.setRTL(true); + + return w; +} + +var dhtmlXCombo_optionTypes = []; +/** +* @desc: build combobox +* @param: parent - (string) id of existing object which will be used as container +* @param: name - (string) name of combobox - will be used in FORM +* @param: width - (int) size of combobox +* @param: tabIndex - (int) tab index, optional +* @type: public +* @topic: 0 +*/ +function dhtmlXCombo(parent,name,width,optionType,tabIndex){ + if (typeof(parent)=="string") + parent=document.getElementById(parent); + + this.dhx_Event(); + this.optionType = (optionType != window.undefined && dhtmlXCombo_optionTypes[optionType]) ? optionType : 'default'; + this._optionObject = dhtmlXCombo_optionTypes[this.optionType]; + + this._disabled = false; + + if (!window.dhx_glbSelectAr){ + window.dhx_glbSelectAr=new Array(); + window.dhx_openedSelect=null; + window.dhx_SelectId=1; + dhtmlxEvent(document.body,"click",this.closeAll); + dhtmlxEvent(document.body,"keydown",function(e){ try { if ((e||event).keyCode==9) window.dhx_glbSelectAr[0].closeAll(); } catch(e) {} return true; } ); + } + + if (parent.tagName=="SELECT") + return dhtmlXComboFromSelect(parent); + else + this._createSelf(parent,name,width,tabIndex); + dhx_glbSelectAr.push(this); +} + +/** +* @desc: change control size +* @param: new_size - (int) new size value +* @type: public +* @topic: 0 +*/ + dhtmlXCombo.prototype.setSize = function(new_size){ + this.DOMlist.style.width=new_size+"px"; + if (this.DOMlistF) this.DOMlistF.style.width=new_size+"px"; + this.DOMelem.style.width=new_size+"px"; + this.DOMelem_input.style.width = Math.max(0,(new_size-19))+'px'; + } +/** +* @desc: switch between combobox and auto-filter modes +* @param: mode - (boolean) enable filtering mode +* @param: url - (string) url for filtering from XML, optional +* @param: cache - (boolean) XML caching, optional +* @param: autosubload - (boolean) enable auto load additional suggestions on selecting last loaded option +* @type: public +* @topic: 0 +*/ + dhtmlXCombo.prototype.enableFilteringMode = function(mode,url,cache,autosubload){ + this._filter=convertStringToBoolean(mode); + + if (url){ + this._xml=url; + this._autoxml=convertStringToBoolean(autosubload); + } + if (convertStringToBoolean(cache)) this._xmlCache=[]; + //this.DOMelem_button.style.display=(this._filter?"none":""); + } + + dhtmlXCombo.prototype.setFilteringParam=function(name,value){ + if (!this._prs) this._prs=[]; + this._prs.push([name,value]); + } +/** +* @desc: disable combobox +* @param: mode - (boolean) disable combobox +* @type: public +* @topic: 1 +*/ + dhtmlXCombo.prototype.disable = function(mode){ + var z=convertStringToBoolean(mode); + if (this._disabled==z) return; + this.DOMelem_input.disabled=z; + this._disabled=z; + } +/** +* @desc: switch to readonly mode +* @param: mode - (boolean) readonly mode +* @param: autosearch - (boolean) true by default +* @type: public +* @topic: 1 +*/ + dhtmlXCombo.prototype.readonly = function(mode,autosearch){ + this.DOMelem_input.readOnly=mode ? true : false; + if(autosearch===false || mode===false){ + this.DOMelem.onkeyup=function(ev){ } + } else { + var that = this; + this.DOMelem.onkeyup=function(ev){ + ev=ev||window.event; + if (ev.keyCode!=9) ev.cancelBubble=true; + if((ev.keyCode >= 48 && ev.keyCode <= 57)||(ev.keyCode >= 65 && ev.keyCode <= 90)){ + for(var i=0; i<that.optionsArr.length; i++){ + var text = that.optionsArr[i].text; + if(text.toString().toUpperCase().indexOf(String.fromCharCode(ev.keyCode)) == 0){ + that.selectOption(i); + break; + } + } + ev.cancelBubble=true; + } + } + } + } + +/** +* @desc: get Option by value +* @param: value - (string) value of option in question +* @type: public +* @return: option object +* @topic: 2 +*/ + dhtmlXCombo.prototype.getOption = function(value) + { + for(var i=0; i<this.optionsArr.length; i++) + if(this.optionsArr[i].value==value) + return this.optionsArr[i]; + return null; + } +/** +* @desc: get Option by label +* @param: label - (string) label of option in question +* @type: public +* @return: option object +* @topic: 2 +*/ + dhtmlXCombo.prototype.getOptionByLabel = function(value) + { + //value=value.replace(/&/g,"&") + for(var i=0; i<this.optionsArr.length; i++) + if(this.optionsArr[i].text==value || this.optionsArr[i]._ctext==value) + return this.optionsArr[i]; + return null; + } +/** +* @desc: get Option by index +* @param: ind - (int) index of option in question +* @type: public +* @return: option object +* @topic: 2 +*/ + dhtmlXCombo.prototype.getOptionByIndex = function(ind){ + return this.optionsArr[ind]; + } +/** +* @desc: clear all options from combobox +* @type: public +* @param: value - (bool) clear current value as well +* @topic: 2 +*/ + dhtmlXCombo.prototype.clearAll = function(all) + { + if (all) this.setComboText(""); + this.optionsArr=new Array(); + this.redrawOptions(); + if (all) this._confirmSelection(); + } +/** +* @desc: delete option by value +* @param: value - (string) value of option in question +* @type: public +* @topic: 2 +*/ + dhtmlXCombo.prototype.deleteOption = function(value) + { + var ind=this.getIndexByValue(value); + if(ind<0) return; + if (this.optionsArr[ind]==this._selOption) this._selOption=null; + this.optionsArr.splice(ind, 1); + this.redrawOptions(); + } + +/** +* @desc: enable/disable immideatly rendering after changes in combobox +* @param: mode - (boolean) enable/disable +* @type: public +* @topic: 1 +*/ + dhtmlXCombo.prototype.render=function(mode){ + this._skiprender=(!convertStringToBoolean(mode)); + this.redrawOptions(); + } + +/** +* @desc: update option in combobox +* @param: oldvalue - (string) index of option in question +* @param: avalue - (variable) +* @type: public +* @topic: 2 +*/ + dhtmlXCombo.prototype.updateOption = function(oldvalue, avalue, atext, acss) + { + var dOpt=this.getOption(oldvalue); + if (typeof(avalue)!="object") avalue={text:atext,value:avalue,css:acss}; + dOpt.setValue(avalue); + this.redrawOptions(); + } +/** +* @desc: add new option +* @param: value - (variable) - different input for different kinds of options - please refer to examples +* @type: public +* @topic: 2 +*/ + dhtmlXCombo.prototype.addOption = function(options) + { + if (!arguments[0].length || typeof(arguments[0])!="object") + args = [arguments]; + else + args = options; + + this.render(false); + for (var i=0; i<args.length; i++) { + var attr = args[i]; + if (attr.length){ + attr.value = attr[0]||""; + attr.text = attr[1]||""; + attr.css = attr[2]||""; + } + this._addOption(attr); + } + this.render(true); + } + + dhtmlXCombo.prototype._addOption = function(attr) + { + dOpt = new this._optionObject(); + this.optionsArr.push(dOpt); + dOpt.setValue.apply(dOpt,[attr]); + this.redrawOptions(); + } + + +/** +* @desc: return index of item by value +* @param: value - (string) value of option in question +* @type: public +* @return: option index +* @topic: 2 +*/ + dhtmlXCombo.prototype.getIndexByValue = function(val){ + for(var i=0; i<this.optionsArr.length; i++) + if(this.optionsArr[i].value == val) return i; + return -1; + } + +/** +* @desc: get value of selected item +* @type: public +* @return: option value +* @topic: 2 +*/ + dhtmlXCombo.prototype.getSelectedValue = function(){ + return (this._selOption?this._selOption.value:null); + } +/** +* @desc: get current text in combobox +* @type: public +* @return: combobox text +* @topic: 2 +*/ + dhtmlXCombo.prototype.getComboText = function(){ + return this.DOMelem_input.value; + } +/** +* @desc: set text in covmbobox +* @param: text - (string) new text label +* @type: public +* @topic: 2 +*/ + dhtmlXCombo.prototype.setComboText = function(text){ + this.DOMelem_input.value=text; + } + +/** +* @desc: set text in covmbobox +* @param: text - (string) new text label +* @type: public +* @topic: 2 +*/ + dhtmlXCombo.prototype.setComboValue = function(text){ + this.setComboText(text); + for(var i=0; i<this.optionsArr.length; i++) + if (this.optionsArr[i].data()[0]==text) + return this.selectOption(i,null,true); + this.DOMelem_hidden_input.value=text; + } + +/** +* @desc: get value which will be sent with form +* @type: public +* @return: combobox value +* @topic: 2 +*/ + dhtmlXCombo.prototype.getActualValue = function(){ + return this.DOMelem_hidden_input.value; + } +/** +* @desc: get text of selected option +* @type: public +* @return: text of option +* @topic: 2 +*/ + dhtmlXCombo.prototype.getSelectedText = function(){ + return (this._selOption?this._selOption.text:""); + } +/** +* @desc: get index of selected option +* @type: public +* @return: option index +* @topic: 2 +*/ + dhtmlXCombo.prototype.getSelectedIndex = function(){ + for(var i=0; i<this.optionsArr.length; i++) + if(this.optionsArr[i] == this._selOption) return i; + return -1; + } +/** +* @desc: set name used while form submit +* @param: name - (string) new combobox name +* @type: public +* @topic: 2 +*/ + dhtmlXCombo.prototype.setName = function(name){ + this.DOMelem_hidden_input.name = name; + this.DOMelem_hidden_input2 = name.replace(/(\]?)$/, "_new_value$1"); + + this.name = name; + } +/** +* @desc: show combox ( reversion to hide command ) +* @param: mode - (boolean) enable/disable +* @type: public +* @topic: 1 +*/ + dhtmlXCombo.prototype.show = function(mode){ + if (convertStringToBoolean(mode)) + this.DOMelem.style.display = ""; + else + this.DOMelem.style.display = "none"; + } + +/** +* @desc: destroy object and any related HTML elements +* @type: public +* @topic: 0 +*/ + dhtmlXCombo.prototype.destructor = function() + { + this.DOMParent.removeChild(this.DOMelem); + this.DOMlist.parentNode.removeChild(this.DOMlist); + var s=dhx_glbSelectAr; + this.DOMParent=this.DOMlist=this.DOMelem=0; + this.DOMlist.combo=this.DOMelem.combo=0; + for(var i=0; i<s.length; i++) + { + if(s[i] == this) + { + s[i] = null; + s.splice(i,1); + return; + } + } + } + +/** +* @desc: create self HTML +* @type: private +* @topic: 0 +*/ + dhtmlXCombo.prototype._createSelf = function(selParent, name, width, tab) + { + if (width.toString().indexOf("%")!=-1){ + var self = this; + var resWidht=parseInt(width)/100; + window.setInterval(function(){ + if (!selParent.parentNode) return; + var ts=selParent.parentNode.offsetWidth*resWidht-2; + if (ts<0) return; + if (ts==self._lastTs) return; + self.setSize(self._lastTs=ts);},500); + var width=parseInt(selParent.offsetWidth); //mm + } + + var width=parseInt(width||100); //mm + this.ListPosition = "Bottom"; //set optionlist positioning + this.DOMParent = selParent; + this._inID = null; + this.name = name; + + this._selOption = null; //selected option object pointer + this.optionsArr = Array(); + + var opt = new this._optionObject(); + opt.DrawHeader(this,name, width,tab); + //HTML select part 2 - options list DIV element + this.DOMlist = document.createElement("DIV"); + this.DOMlist.className = 'dhx_combo_list '+(dhtmlx.skin?dhtmlx.skin+"_list":""); + this.DOMlist.style.width=width-(_isIE?0:0)+"px"; + if (_isOpera || _isKHTML ) + this.DOMlist.style.overflow="auto"; + this.DOMlist.style.display = "none"; + document.body.insertBefore(this.DOMlist,document.body.firstChild); + if (_isIE) { + this.DOMlistF = document.createElement("IFRAME"); + this.DOMlistF.style.border="0px"; + this.DOMlistF.className = 'dhx_combo_list'; + this.DOMlistF.style.width=width-(_isIE?0:0)+"px"; + this.DOMlistF.style.display = "none"; + this.DOMlistF.src="javascript:false;"; + document.body.insertBefore(this.DOMlistF,document.body.firstChild); + } + + + + this.DOMlist.combo=this.DOMelem.combo=this; + + this.DOMelem_input.onkeydown = this._onKey; + this.DOMelem_input.onkeypress = this._onKeyF; + this.DOMelem_input.onblur = this._onBlur; + this.DOMelem.onclick = this._toggleSelect; + this.DOMlist.onclick = this._selectOption; + this.DOMlist.onmousedown = function(){ + this._skipBlur=true; + } + + this.DOMlist.onkeydown = function(e){ + this.combo.DOMelem_input.focus(); + (e||event).cancelBubble=true; + this.combo.DOMelem_input.onkeydown(e) + } + this.DOMlist.onmouseover = this._listOver; + + } + + dhtmlXCombo.prototype._listOver = function(e) + { + e = e||event; + e.cancelBubble = true; + var node = (_isIE?event.srcElement:e.target); + var that = this.combo; + if ( node.parentNode == that.DOMlist ) { + if(that._selOption) that._selOption.deselect(); + if(that._tempSel) that._tempSel.deselect(); + + var i=0; + for (i; i<that.DOMlist.childNodes.length; i++) { + if (that.DOMlist.childNodes[i]==node) break; + } + var z=that.optionsArr[i]; + that._tempSel=z; + that._tempSel.select(); + + if ((that._autoxml)&&((i+1)==that._lastLength)){ + that._fetchOptions(i+1,that._lasttext||""); + } + } + + } + +/** +* @desc: place option list in necessary place on screen +* @type: private +* @topic: 0 +*/ + dhtmlXCombo.prototype._positList = function() + { + //if(this.ListAutoPosit) this.enableOptionAutoPositioning(true); //mm auto posit + var pos=this.getPosition(this.DOMelem); + if(this.ListPosition == 'Bottom'){ + this.DOMlist.style.top = pos[1]+this.DOMelem.offsetHeight-1+"px"; + this.DOMlist.style.left = pos[0]+"px"; + } + else if(this.ListPosition == 'Top'){ //mm + this.DOMlist.style.top = pos[1] - this.DOMlist.offsetHeight+"px"; + + this.DOMlist.style.left = pos[0]+"px"; //mm + } + else{ + this.DOMlist.style.top = pos[1]+"px"; + this.DOMlist.style.left = pos[0]+this.DOMelem.offsetWidth+"px"; + } + + } + + dhtmlXCombo.prototype.getPosition = function(oNode,pNode){ + if (_isChrome){ + if(!pNode) + var pNode = document.body + + var oCurrentNode=oNode; + var iLeft=0; + var iTop=0; + while ((oCurrentNode)&&(oCurrentNode!=pNode)){ + iLeft+=oCurrentNode.offsetLeft-oCurrentNode.scrollLeft; + iTop+=oCurrentNode.offsetTop-oCurrentNode.scrollTop; + oCurrentNode=oCurrentNode.offsetParent; + } + if (pNode == document.body ){ + if (_isIE && _isIE<8){ + + if (document.documentElement.scrollTop) + iTop+=document.documentElement.scrollTop; + if (document.documentElement.scrollLeft) + iLeft+=document.documentElement.scrollLeft; + } + else + if (!_isFF){ + iLeft+=document.body.offsetLeft; + iTop+=document.body.offsetTop; + } + } + return new Array(iLeft,iTop); + } + var pos = getOffset(oNode); + return [pos.left, pos.top]; + + } +/** +* @desc: correct current selection ( move it to first visible option ) +* @type: private +* @topic: 2 +*/ + dhtmlXCombo.prototype._correctSelection = function(){ + if (this.getComboText()!="") + for (var i=0; i<this.optionsArr.length; i++) + if (!this.optionsArr[i].isHidden()){ + return this.selectOption(i,true,false); + } + this.unSelectOption(); + } +/** +* @desc: select next option in combobox +* @param: step - (int) step size +* @type: private +* @topic: 2 +*/ + dhtmlXCombo.prototype.selectNext = function(step){ + var z=this.getSelectedIndex()+step; + while (this.optionsArr[z]){ + if (!this.optionsArr[z].isHidden()) + return this.selectOption(z,false,false); + z+=step; + } + } +/** +* @desc: on keypressed handler +* @type: private +* @topic: 0 +*/ + dhtmlXCombo.prototype._onKeyF = function(e){ + var that=this.parentNode.combo; + var ev=e||event; + ev.cancelBubble=true; + if (ev.keyCode=="13" || ev.keyCode=="9" ){ + that._confirmSelection(); + that.closeAll(); + } else + if (ev.keyCode=="27" ){ + that._resetSelection(); + that.closeAll(); + } else that._activeMode=true; + if (ev.keyCode=="13" || ev.keyCode=="27" ){ //enter + that.callEvent("onKeyPressed",[ev.keyCode]) + return false; + } + return true; + } +/** +* @desc: on keyup handler +* @type: private +* @topic: 0 +*/ + dhtmlXCombo.prototype._onKey = function(e){ + var that=this.parentNode.combo; + (e||event).cancelBubble=true; + var ev=(e||event).keyCode; + if (ev>15 && ev<19) return true; //shift,alt,ctrl + if (ev==27) return; + if ((that.DOMlist.style.display!="block")&&(ev!="13")&&(ev!="9")&&((!that._filter)||(that._filterAny))) + that.DOMelem.onclick(e||event); + + if ((ev!="13")&&(ev!="9")){ + window.setTimeout(function(){ that._onKeyB(ev); },1); + if (ev=="40" || ev=="38") + return false; + } + else if (ev==9){ + that.closeAll(); + (e||event).cancelBubble=false; + } + } + dhtmlXCombo.prototype._onKeyB = function(ev) + { + if (ev=="40"){ //down + var z=this.selectNext(1); + } else if (ev=="38"){ //up + this.selectNext(-1); + } else{ + this.callEvent("onKeyPressed",[ev]) + if (this._filter) return this.filterSelf((ev==8)||(ev==46)); + for(var i=0; i<this.optionsArr.length; i++) + if (this.optionsArr[i].data()[1]==this.DOMelem_input.value){ +// ev.cancelBubble=true; + this.selectOption(i,false,false); + return false; + } + this.unSelectOption(); + } + return true; + } + + +/** +* @desc: on data change handler +* @type: private +* @topic: 0 +*/ + dhtmlXCombo.prototype._onBlur = function() + { + var self = this.parentNode._self; + window.setTimeout(function(){ + if (self.DOMlist._skipBlur) return !(self.DOMlist._skipBlur=false); + self._confirmSelection(); + self.callEvent("onBlur",[]); + },100) + + } +/** +* @desc: redraw combobox options +* @type: private +* @topic: 2 +*/ + dhtmlXCombo.prototype.redrawOptions = function(){ + if (this._skiprender) return; + for(var i=this.DOMlist.childNodes.length-1; i>=0; i--) + this.DOMlist.removeChild(this.DOMlist.childNodes[i]); + for(var i=0; i<this.optionsArr.length; i++) + this.DOMlist.appendChild(this.optionsArr[i].render()); + + + + + + } +/** +* @desc: load list of options from XML +* @param: url - (string) xml url +* @type: public +* @topic: 0 +*/ + dhtmlXCombo.prototype.loadXML = function(url,afterCall){ + this._load=true; + this.callEvent("onXLS",[]); + if (this._prs) + for (var i=0; i<this._prs.length; i++) + url+=[getUrlSymbol(url),escape(this._prs[i][0]),"=",escape(this._prs[i][1])].join(""); + if ((this._xmlCache)&&(this._xmlCache[url])){ + this._fillFromXML(this,null,null,null,this._xmlCache[url]); + if (afterCall) afterCall(); + } + else{ + var xml=(new dtmlXMLLoaderObject(this._fillFromXML,this,true,true)); + if (afterCall) xml.waitCall=afterCall; + xml._cPath=url; + xml.loadXML(url); + } + } + +/** +* @desc: load list of options from XML string +* @param: astring - (string) xml string +* @type: public +* @topic: 0 +*/ + dhtmlXCombo.prototype.loadXMLString = function(astring){ + var xml=(new dtmlXMLLoaderObject(this._fillFromXML,this,true,true)); + xml.loadXMLString(astring); + } + +/** +* @desc: on XML load handler +* @type: private +* @topic: 0 +*/ + dhtmlXCombo.prototype._fillFromXML = function(obj,b,c,d,xml){ + if (obj._xmlCache) obj._xmlCache[xml._cPath]=xml; + + //check that XML is correct + var toptag=xml.getXMLTopNode("complete"); + if (toptag.tagName!="complete") return; + var top=xml.doXPath("//complete"); + var options=xml.doXPath("//option"); + + var add = false; + + obj.render(false); + if ((!top[0])||(!top[0].getAttribute("add"))){ + obj.clearAll(); + obj._lastLength=options.length; + if (obj._xml){ + if ((!options) || (!options.length)) + obj.closeAll(); + else { + if (obj._activeMode){ + obj._positList(); + obj.DOMlist.style.display="block"; + if (_isIE) obj._IEFix(true); + } + }} + } else { + obj._lastLength+=options.length||Infinity; + add = true; + } + + for (var i=0; i<options.length; i++) { + var attr = new Object(); + attr.text = options[i].firstChild?options[i].firstChild.nodeValue:""; + for (var j=0; j<options[i].attributes.length; j++) { + var a = options[i].attributes[j]; + if (a) + attr[a.nodeName] = a.nodeValue; + } + obj._addOption(attr); + } + obj.render(add!=true || (!!options.length)); + + if ((obj._load)&&(obj._load!==true)) + obj.loadXML(obj._load); + else{ + obj._load=false; + if ((!obj._lkmode)&&(obj._filter)) + obj._correctSelection(); + } + + var selected=xml.doXPath("//option[@selected]"); + if (selected.length) + obj.selectOption(obj.getIndexByValue(selected[0].getAttribute("value")),false,true); + + obj.callEvent("onXLE",[]); + + } +/** +* @desc: deselect option +* @type: public +* @topic: 1 +*/ + dhtmlXCombo.prototype.unSelectOption = function(){ + if (this._selOption) this._selOption.deselect(); + if(this._tempSel) this._tempSel.deselect(); + this._tempSel=this._selOption=null; + } + +/** +* @desc: confirms combo value (recommended to be called on form submit) +* @type: public +* @topic: 1 +*/ + dhtmlXCombo.prototype.confirmValue = function(){ + this._confirmSelection(); + } + + + dhtmlXCombo.prototype._confirmSelection = function(data,status){ + if(arguments.length==0){ + var z=this.getOptionByLabel(this.DOMelem_input.value); + data = z?z.value:this.DOMelem_input.value; + status = (z==null); + if (data==this.getActualValue()) return; + } + + this.DOMelem_hidden_input.value=data; + this.DOMelem_hidden_input2.value = (status?"true":"false"); + this.callEvent("onChange",[]); + this._activeMode=false; + } + dhtmlXCombo.prototype._resetSelection = function(data,status){ + var z=this.getOption(this.DOMelem_hidden_input.value); + this.setComboValue(z?z.data()[0]:this.DOMelem_hidden_input.value) + this.setComboText(z?z.data()[1]:this.DOMelem_hidden_input.value) + } + +/** +* @desc: select option +* @param: ind - (int) index of option in question +* @param: filter - (boolean) enable autocomplit range, optional +* @param: conf - (boolean) true for real selection, false for pre-selection +* @type: public +* @topic: 1 +*/ + dhtmlXCombo.prototype.selectOption = function(ind,filter,conf){ + if (arguments.length<3) conf=true; + this.unSelectOption(); + var z=this.optionsArr[ind]; + if (!z) return; + this._selOption=z; + this._selOption.select(); + + var corr=this._selOption.content.offsetTop+this._selOption.content.offsetHeight-this.DOMlist.scrollTop-this.DOMlist.offsetHeight; + if (corr>0) this.DOMlist.scrollTop+=corr; + corr=this.DOMlist.scrollTop-this._selOption.content.offsetTop; + if (corr>0) this.DOMlist.scrollTop-=corr; + var data=this._selOption.data(); + + if (conf){ + this.setComboText(data[1]); + this._confirmSelection(data[0],false); + + if ((this._autoxml)&&((ind+1)==this._lastLength)) + this._fetchOptions(ind+1,this._lasttext||""); + } + + if (filter){ + var text=this.getComboText(); + if (text!=data[1]){ + this.setComboText(data[1]); + dhtmlXRange(this.DOMelem_input,text.length+1,data[1].length); + } + } + else + this.setComboText(data[1]); + this._selOption.RedrawHeader(this); + + /*Event*/ + this.callEvent("onSelectionChange",[]); + } +/** +* @desc: option on select handler +* @type: private +* @topic: 2 +*/ + dhtmlXCombo.prototype._selectOption = function(e) + { + (e||event).cancelBubble = true; + var node=(_isIE?event.srcElement:e.target); + var that=this.combo; + while (!node._self) { + node = node.parentNode; + if (!node) + return; + } + + var i=0; + for (i; i<that.DOMlist.childNodes.length; i++) { + if (that.DOMlist.childNodes[i]==node) break; + } + that.selectOption(i,false,true); + that.closeAll(); + that.callEvent("onBlur",[]) + that._activeMode=false; + } +/** +* @desc: open list of options +* @type: public +* @topic: 2 +*/ + dhtmlXCombo.prototype.openSelect = function(){ + + + + if (this._disabled) return; + this.closeAll(); + this._positList(); + this.DOMlist.style.display="block"; + this.callEvent("onOpen",[]); + if(this._tempSel) this._tempSel.deselect(); + if(this._selOption) this._selOption.select(); + if(this._selOption){ + var corr=this._selOption.content.offsetTop+this._selOption.content.offsetHeight-this.DOMlist.scrollTop-this.DOMlist.offsetHeight; + if (corr>0) this.DOMlist.scrollTop+=corr; + corr=this.DOMlist.scrollTop-this._selOption.content.offsetTop; + if (corr>0) this.DOMlist.scrollTop-=corr; + } + /* if (this.autoOptionSize){ + var x=this.DOMlist.offsetWidth; + + for ( var i=0; i<this.optionsArr.length; i++){ + if(i==0) alert("this.DOMlist.childNodes[i].scrollWidth ="+ this.DOMlist.childNodes[i].scrollWidth + "> x= "+ x); + if (this.DOMlist.childNodes[i].scrollWidth > x) + x=this.DOMlist.childNodes[i].scrollWidth; + } + + this.DOMlist.style.width=x+"px"; + }*/ + + + if (_isIE) this._IEFix(true); + this.DOMelem_input.focus(); + + if (this._filter) this.filterSelf(); + } +/** +* @desc: open(close) list +* @type: private +* @topic: 2 +*/ + dhtmlXCombo.prototype._toggleSelect = function(e) + { + var that=this.combo; + if ( that.DOMlist.style.display == "block" ) { + that.closeAll(); + } else { + that.openSelect(); + } + (e||event).cancelBubble = true; + } + + dhtmlXCombo.prototype._fetchOptions=function(ind,text){ + if (text=="") { this.closeAll(); return this.clearAll(); } + var url=this._xml+((this._xml.indexOf("?")!=-1)?"&":"?")+"pos="+ind+"&mask="+encodeURIComponent(text); + this._lasttext=text; + if (this._load) this._load=url; + else { + if (!this.callEvent("onDynXLS",[text,ind])) return; + this.loadXML(url); + } + } +/** +* @desc: filter list of options +* @type: private +* @topic: 2 +*/ + dhtmlXCombo.prototype.filterSelf = function(mode) + { + var text=this.getComboText(); + if (this._xml){ + this._lkmode=mode; + this._fetchOptions(0,text); + } + try{ var filter=new RegExp("^"+text,"i"); } catch (e){ var filter=new RegExp("^"+text.replace(/([\[\]\{\}\(\)\+\*\\])/g,"\\$1")); } + this.filterAny=false; + for(var i=0; i<this.optionsArr.length; i++){ + var z=filter.test(this.optionsArr[i].text); + this.filterAny|=z; + this.optionsArr[i].hide(!z); + } + if (!this.filterAny) { + this.closeAll(); + this._activeMode=true; + } + else { + if (this.DOMlist.style.display!="block") + this.openSelect(); + if (_isIE) this._IEFix(true); + } + + if (!mode) + this._correctSelection(); + else this.unSelectOption(); + } + + + + +/** +* @desc: set hidden iframe for IE +* @type: private +* @topic: 2 +*/ + dhtmlXCombo.prototype._IEFix = function(mode){ + this.DOMlistF.style.display=(mode?"block":"none"); + this.DOMlistF.style.top=this.DOMlist.style.top; + this.DOMlistF.style.left=this.DOMlist.style.left; + } +/** +* @desc: close opened combobox list +* @type: public +* @topic: 1 +*/ + dhtmlXCombo.prototype.closeAll = function() + { + if(window.dhx_glbSelectAr) + for (var i=0; i<dhx_glbSelectAr.length; i++){ + if (dhx_glbSelectAr[i].DOMlist.style.display=="block") { + dhx_glbSelectAr[i].DOMlist.style.display = "none"; + if (_isIE) dhx_glbSelectAr[i]._IEFix(false); + } + dhx_glbSelectAr[i]._activeMode=false; + } + } + + +/** +* @desc: create selection range in input control +* @param: InputId - (string) id of input ( object can be used as well ) +* @param: Start - (int) start selection position +* @param: End - (int) end selection position +* @type: public +* @topic: 0 +*/ +function dhtmlXRange(InputId, Start, End) +{ + var Input = typeof(InputId)=='object' ? InputId : document.getElementById(InputId); + try{ Input.focus(); } catch(e){}; + var Length = Input.value.length; + Start--; + if (Start < 0 || Start > End || Start > Length) + Start = 0; + if (End > Length) + End = Length; + if (Start==End) return; + if (Input.setSelectionRange) { + Input.setSelectionRange(Start, End); + } else if (Input.createTextRange) { + var range = Input.createTextRange(); + range.moveStart('character', Start); + range.moveEnd('character', End-Length); + try{ + range.select(); + } + catch(e){ + } + } +} +/** +* @desc: combobox option object constructor +* @type: public +* @topic: 0 +*/ + dhtmlXCombo_defaultOption = function(){ + this.init(); + } +/** +* @desc: option initialization function +* @type: private +* @topic: 4 +*/ + dhtmlXCombo_defaultOption.prototype.init = function(){ + this.value = null; + this.text = ""; + this.selected = false; + this.css = ""; + } +/** +* @desc: mark option as selected +* @type: public +* @topic: 4 +*/ + dhtmlXCombo_defaultOption.prototype.select = function(){ + if (this.content){ + this.content.className="dhx_selected_option"+(dhtmlx.skin?" combo_"+dhtmlx.skin+"_sel":""); + } + } +/** +* @desc: hide option +* @param: mode - (boolean) +* @type: public +* @topic: 4 +*/ + dhtmlXCombo_defaultOption.prototype.hide = function(mode){ + this.render().style.display=mode?"none":""; + } +/** +* @desc: return hide state of option +* @type: public +* @return: hide state of option +* @topic: 4 +*/ + dhtmlXCombo_defaultOption.prototype.isHidden = function(){ + return (this.render().style.display=="none"); + } +/** +* @desc: mark option as not selected +* @type: public +* @topic: 4 +*/ + dhtmlXCombo_defaultOption.prototype.deselect = function(){ + if (this.content) this.render(); + this.content.className=""; + } +/** +* @desc: set value of option +* @param: value - (string) value +* @param: text - (string) text +* @param: css - (string) css style string +* @type: public +* @topic: 4 +*/ +dhtmlXCombo_defaultOption.prototype.setValue = function(attr){ + this.value = attr.value||""; + this.text = attr.text||""; + this.css = attr.css||""; + this.content=null; +} + + +/** +* @desc: render option +* @type: private +* @topic: 4 +*/ + dhtmlXCombo_defaultOption.prototype.render = function(){ + if (!this.content){ + this.content=document.createElement("DIV"); + this.content._self = this; + + this.content.style.cssText='width:100%; overflow:hidden;'+this.css; + if (_isOpera || _isKHTML ) this.content.style.padding="2px 0px 2px 0px"; + this.content.innerHTML=this.text; + this._ctext=_isIE?this.content.innerText:this.content.textContent; + } + return this.content; + } +/** +* @desc: return option data +* @type: public +* @return: array of data related to option +* @topic: 4 +*/ + dhtmlXCombo_defaultOption.prototype.data = function(){ + if (this.content) + return [this.value,this._ctext ? this._ctext : this.text]; + } + +dhtmlXCombo_defaultOption.prototype.DrawHeader = function(self, name, width, tab) +{ + var z=document.createElement("DIV"); + z.style.width = width+"px"; + z.className = 'dhx_combo_box '+(dhtmlx.skin||""); + z._self = self; + self.DOMelem = z; + this._DrawHeaderInput(self, name, width,tab); + this._DrawHeaderButton(self, name, width); + self.DOMParent.appendChild(self.DOMelem); +} + +dhtmlXCombo_defaultOption.prototype._DrawHeaderInput = function(self, name, width,tab) +{ + + var z=document.createElement('input'); + z.setAttribute("autocomplete","off"); + z.type = 'text'; + z.className = 'dhx_combo_input'; + + if (tab) z.tabIndex=tab; + z.style.width = width-19-(document.compatMode=="BackCompat"?0:3)+'px'; + self.DOMelem.appendChild(z); + self.DOMelem_input = z; + + z = document.createElement('input'); + z.type = 'hidden'; + z.name = name; + self.DOMelem.appendChild(z); + self.DOMelem_hidden_input = z; + + z = document.createElement('input'); + z.type = 'hidden'; + z.name = (name||"").replace(/(\]?)$/, "_new_value$1"); + z.value="true"; + self.DOMelem.appendChild(z); + self.DOMelem_hidden_input2 = z; +} + +dhtmlXCombo_defaultOption.prototype._DrawHeaderButton = function(self, name, width) +{ + var z=document.createElement('img'); + z.className = 'dhx_combo_img'; + if(dhtmlx.image_path) dhx_globalImgPath = dhtmlx.image_path; + z.src = (window.dhx_globalImgPath?dhx_globalImgPath:"")+'combo_select'+(dhtmlx.skin?"_"+dhtmlx.skin:"")+'.gif'; + self.DOMelem.appendChild(z); + self.DOMelem_button=z; +} + +dhtmlXCombo_defaultOption.prototype.RedrawHeader = function(self) +{ +} + + +dhtmlXCombo_optionTypes['default'] = dhtmlXCombo_defaultOption; + +dhtmlXCombo.prototype.dhx_Event=function() +{ + this.dhx_SeverCatcherPath=""; + + this.attachEvent = function(original, catcher, CallObj) + { + CallObj = CallObj||this; + original = 'ev_'+original; + if ( ( !this[original] ) || ( !this[original].addEvent ) ) { + var z = new this.eventCatcher(CallObj); + z.addEvent( this[original] ); + this[original] = z; + } + return ( original + ':' + this[original].addEvent(catcher) ); //return ID (event name & event ID) + } + this.callEvent=function(name,arg0){ + if (this["ev_"+name]) return this["ev_"+name].apply(this,arg0); + return true; + } + this.checkEvent=function(name){ + if (this["ev_"+name]) return true; + return false; + } + + this.eventCatcher = function(obj) + { + var dhx_catch = new Array(); + var m_obj = obj; + var func_server = function(catcher,rpc) + { + catcher = catcher.split(":"); + var postVar=""; + var postVar2=""; + var target=catcher[1]; + if (catcher[1]=="rpc"){ + postVar='<?xml version="1.0"?><methodCall><methodName>'+catcher[2]+'</methodName><params>'; + postVar2="</params></methodCall>"; + target=rpc; + } + var z = function() { + } + return z; + } + var z = function() + { + if (dhx_catch) + var res=true; + for (var i=0; i<dhx_catch.length; i++) { + if (dhx_catch[i] != null) { + var zr = dhx_catch[i].apply( m_obj, arguments ); + res = res && zr; + } + } + return res; + } + z.addEvent = function(ev) + { + if ( typeof(ev) != "function" ) + if (ev && ev.indexOf && ev.indexOf("server:") == 0) + ev = new func_server(ev,m_obj.rpcServer); + else + ev = eval(ev); + if (ev) + return dhx_catch.push( ev ) - 1; + return false; + } + z.removeEvent = function(id) + { + dhx_catch[id] = null; + } + return z; + } + + this.detachEvent = function(id) + { + if (id != false) { + var list = id.split(':'); //get EventName and ID + this[ list[0] ].removeEvent( list[1] ); //remove event + } + } +}; + + +//combo +(function(){ + dhtmlx.extend_api("dhtmlXCombo",{ + _init:function(obj){ + if (obj.image_path) + dhx_globalImgPath=obj.image_path; + return [obj.parent, obj.name, (obj.width||"100%"), obj.type, obj.index ]; + }, + filter:"filter_command", + auto_height:"enableOptionAutoHeight", + auto_position:"enableOptionAutoPositioning", + auto_width:"enableOptionAutoWidth", + xml:"loadXML", + readonly:"readonly", + items:"addOption" + },{ + filter_command:function(data){ + if (typeof data == "string") + this.enableFilteringMode(true,data); + else + this.enableFilteringMode(data); + } + }); +})(); + + +//(c)dhtmlx ltd. www.dhtmlx.com
+ static/dhtmlxcommon.js view
@@ -0,0 +1,940 @@+//v.2.6 build 100722++/* +Copyright DHTMLX LTD. http://www.dhtmlx.com +You allowed to use this component or parts of it under GPL terms +To use it on other terms or get Professional edition of the component please contact us at sales@dhtmlx.com +*/+dhtmlx=function(obj){ + for (var a in obj) dhtmlx[a]=obj[a]; + return dhtmlx; //simple singleton +}; +dhtmlx.extend_api=function(name,map,ext){ + var t = window[name]; + if (!t) return; //component not defined + window[name]=function(obj){ + if (obj && typeof obj == "object" && !obj.tagName){ + var that = t.apply(this,(map._init?map._init(obj):arguments)); + //global settings + for (var a in dhtmlx) + if (map[a]) this[map[a]](dhtmlx[a]); + //local settings + for (var a in obj){ + if (map[a]) this[map[a]](obj[a]); + else if (a.indexOf("on")==0){ + this.attachEvent(a,obj[a]); + } + } + } else + var that = t.apply(this,arguments); + if (map._patch) map._patch(this); + return that||this; + }; + window[name].prototype=t.prototype; + if (ext) + dhtmlXHeir(window[name].prototype,ext); +}; + +dhtmlxAjax={ + get:function(url,callback){ + var t=new dtmlXMLLoaderObject(true); + t.async=(arguments.length<3); + t.waitCall=callback; + t.loadXML(url) + return t; + }, + post:function(url,post,callback){ + var t=new dtmlXMLLoaderObject(true); + t.async=(arguments.length<4); + t.waitCall=callback; + t.loadXML(url,true,post) + return t; + }, + getSync:function(url){ + return this.get(url,null,true) + }, + postSync:function(url,post){ + return this.post(url,post,null,true); + } +} + +/** + * @desc: xmlLoader object + * @type: private + * @param: funcObject - xml parser function + * @param: object - jsControl object + * @param: async - sync/async mode (async by default) + * @param: rSeed - enable/disable random seed ( prevent IE caching) + * @topic: 0 + */ +function dtmlXMLLoaderObject(funcObject, dhtmlObject, async, rSeed){ + this.xmlDoc=""; + + if (typeof (async) != "undefined") + this.async=async; + else + this.async=true; + + this.onloadAction=funcObject||null; + this.mainObject=dhtmlObject||null; + this.waitCall=null; + this.rSeed=rSeed||false; + return this; +}; +/** + * @desc: xml loading handler + * @type: private + * @param: dtmlObject - xmlLoader object + * @topic: 0 + */ +dtmlXMLLoaderObject.prototype.waitLoadFunction=function(dhtmlObject){ + var once = true; + this.check=function (){ + if ((dhtmlObject)&&(dhtmlObject.onloadAction != null)){ + if ((!dhtmlObject.xmlDoc.readyState)||(dhtmlObject.xmlDoc.readyState == 4)){ + if (!once) + return; + + once=false; //IE 5 fix + if (typeof dhtmlObject.onloadAction == "function") + dhtmlObject.onloadAction(dhtmlObject.mainObject, null, null, null, dhtmlObject); + + if (dhtmlObject.waitCall){ + dhtmlObject.waitCall.call(this,dhtmlObject); + dhtmlObject.waitCall=null; + } + } + } + }; + return this.check; +}; + +/** + * @desc: return XML top node + * @param: tagName - top XML node tag name (not used in IE, required for Safari and Mozilla) + * @type: private + * @returns: top XML node + * @topic: 0 + */ +dtmlXMLLoaderObject.prototype.getXMLTopNode=function(tagName, oldObj){ + if (this.xmlDoc.responseXML){ + var temp = this.xmlDoc.responseXML.getElementsByTagName(tagName); + if(temp.length==0 && tagName.indexOf(":")!=-1) + var temp = this.xmlDoc.responseXML.getElementsByTagName((tagName.split(":"))[1]); + var z = temp[0]; + } else + var z = this.xmlDoc.documentElement; + + if (z){ + this._retry=false; + return z; + } + + if ((_isIE)&&(!this._retry)){ + //fall back to MS.XMLDOM + var xmlString = this.xmlDoc.responseText; + var oldObj = this.xmlDoc; + this._retry=true; + this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); + this.xmlDoc.async=false; + this.xmlDoc["loadXM"+"L"](xmlString); + + return this.getXMLTopNode(tagName, oldObj); + } + dhtmlxError.throwError("LoadXML", "Incorrect XML", [ + (oldObj||this.xmlDoc), + this.mainObject + ]); + + return document.createElement("DIV"); +}; + +/** + * @desc: load XML from string + * @type: private + * @param: xmlString - xml string + * @topic: 0 + */ +dtmlXMLLoaderObject.prototype.loadXMLString=function(xmlString){ + { + try{ + var parser = new DOMParser(); + this.xmlDoc=parser.parseFromString(xmlString, "text/xml"); + } + catch (e){ + this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); + this.xmlDoc.async=this.async; + this.xmlDoc["loadXM"+"L"](xmlString); + } + } + + this.onloadAction(this.mainObject, null, null, null, this); + + if (this.waitCall){ + this.waitCall(); + this.waitCall=null; + } +} +/** + * @desc: load XML + * @type: private + * @param: filePath - xml file path + * @param: postMode - send POST request + * @param: postVars - list of vars for post request + * @topic: 0 + */ +dtmlXMLLoaderObject.prototype.loadXML=function(filePath, postMode, postVars, rpc){ + if (this.rSeed) + filePath+=((filePath.indexOf("?") != -1) ? "&" : "?")+"a_dhx_rSeed="+(new Date()).valueOf(); + this.filePath=filePath; + + if ((!_isIE)&&(window.XMLHttpRequest)) + this.xmlDoc=new XMLHttpRequest(); + else { + if (document.implementation&&document.implementation.createDocument){ + this.xmlDoc=document.implementation.createDocument("", "", null); + this.xmlDoc.onload=new this.waitLoadFunction(this); + this.xmlDoc.load(filePath); + return; + } else + this.xmlDoc=new ActiveXObject("Microsoft.XMLHTTP"); + } + + if (this.async) + this.xmlDoc.onreadystatechange=new this.waitLoadFunction(this); + this.xmlDoc.open(postMode ? "POST" : "GET", filePath, this.async); + + if (rpc){ + this.xmlDoc.setRequestHeader("User-Agent", "dhtmlxRPC v0.1 ("+navigator.userAgent+")"); + this.xmlDoc.setRequestHeader("Content-type", "text/xml"); + } + + else if (postMode) + this.xmlDoc.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + + this.xmlDoc.setRequestHeader("X-Requested-With","XMLHttpRequest"); + this.xmlDoc.send(null||postVars); + + if (!this.async) + (new this.waitLoadFunction(this))(); +}; +/** + * @desc: destructor, cleans used memory + * @type: private + * @topic: 0 + */ +dtmlXMLLoaderObject.prototype.destructor=function(){ + this._filterXPath = null; + this._getAllNamedChilds = null; + this._retry = null; + this.async = null; + this.rSeed = null; + this.filePath = null; + this.onloadAction = null; + this.mainObject = null; + this.xmlDoc = null; + this.doXPath = null; + this.doXPathOpera = null; + this.doXSLTransToObject = null; + this.doXSLTransToString = null; + this.loadXML = null; + this.loadXMLString = null; + // this.waitLoadFunction = null; + this.doSerialization = null; + this.xmlNodeToJSON = null; + this.getXMLTopNode = null; + this.setXSLParamValue = null; + return null; +} + +dtmlXMLLoaderObject.prototype.xmlNodeToJSON = function(node){ + var t={}; + for (var i=0; i<node.attributes.length; i++) + t[node.attributes[i].name]=node.attributes[i].value; + t["_tagvalue"]=node.firstChild?node.firstChild.nodeValue:""; + for (var i=0; i<node.childNodes.length; i++){ + var name=node.childNodes[i].tagName; + if (name){ + if (!t[name]) t[name]=[]; + t[name].push(this.xmlNodeToJSON(node.childNodes[i])); + } + } + return t; + } + +/** + * @desc: Call wrapper + * @type: private + * @param: funcObject - action handler + * @param: dhtmlObject - user data + * @returns: function handler + * @topic: 0 + */ +function callerFunction(funcObject, dhtmlObject){ + this.handler=function(e){ + if (!e) + e=window.event; + funcObject(e, dhtmlObject); + return true; + }; + return this.handler; +}; + +/** + * @desc: Calculate absolute position of html object + * @type: private + * @param: htmlObject - html object + * @topic: 0 + */ +function getAbsoluteLeft(htmlObject){ + return getOffset(htmlObject).left; +} +/** + * @desc: Calculate absolute position of html object + * @type: private + * @param: htmlObject - html object + * @topic: 0 + */ +function getAbsoluteTop(htmlObject){ + return getOffset(htmlObject).top; +} + +function getOffsetSum(elem) { + var top=0, left=0; + while(elem) { + top = top + parseInt(elem.offsetTop); + left = left + parseInt(elem.offsetLeft); + elem = elem.offsetParent; + } + return {top: top, left: left}; +} +function getOffsetRect(elem) { + var box = elem.getBoundingClientRect(); + var body = document.body; + var docElem = document.documentElement; + var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop; + var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft; + var clientTop = docElem.clientTop || body.clientTop || 0; + var clientLeft = docElem.clientLeft || body.clientLeft || 0; + var top = box.top + scrollTop - clientTop; + var left = box.left + scrollLeft - clientLeft; + return { top: Math.round(top), left: Math.round(left) }; +} +function getOffset(elem) { + if (elem.getBoundingClientRect) { + return getOffsetRect(elem); + } else { + return getOffsetSum(elem); + } +} + +/** +* @desc: Convert string to it boolean representation +* @type: private +* @param: inputString - string for covertion +* @topic: 0 +*/ +function convertStringToBoolean(inputString){ + if (typeof (inputString) == "string") + inputString=inputString.toLowerCase(); + + switch (inputString){ + case "1": + case "true": + case "yes": + case "y": + case 1: + case true: + return true; + break; + + default: return false; + } +} + +/** +* @desc: find out what symbol to use as url param delimiters in further params +* @type: private +* @param: str - current url string +* @topic: 0 +*/ +function getUrlSymbol(str){ + if (str.indexOf("?") != -1) + return "&" + else + return "?" +} + +function dhtmlDragAndDropObject(){ + if (window.dhtmlDragAndDrop) + return window.dhtmlDragAndDrop; + + this.lastLanding=0; + this.dragNode=0; + this.dragStartNode=0; + this.dragStartObject=0; + this.tempDOMU=null; + this.tempDOMM=null; + this.waitDrag=0; + window.dhtmlDragAndDrop=this; + + return this; +}; + +dhtmlDragAndDropObject.prototype.removeDraggableItem=function(htmlNode){ + htmlNode.onmousedown=null; + htmlNode.dragStarter=null; + htmlNode.dragLanding=null; +} +dhtmlDragAndDropObject.prototype.addDraggableItem=function(htmlNode, dhtmlObject){ + htmlNode.onmousedown=this.preCreateDragCopy; + htmlNode.dragStarter=dhtmlObject; + this.addDragLanding(htmlNode, dhtmlObject); +} +dhtmlDragAndDropObject.prototype.addDragLanding=function(htmlNode, dhtmlObject){ + htmlNode.dragLanding=dhtmlObject; +} +dhtmlDragAndDropObject.prototype.preCreateDragCopy=function(e){ + if ((e||window.event) && (e||event).button == 2) + return; + + if (window.dhtmlDragAndDrop.waitDrag){ + window.dhtmlDragAndDrop.waitDrag=0; + document.body.onmouseup=window.dhtmlDragAndDrop.tempDOMU; + document.body.onmousemove=window.dhtmlDragAndDrop.tempDOMM; + return false; + } + + window.dhtmlDragAndDrop.waitDrag=1; + window.dhtmlDragAndDrop.tempDOMU=document.body.onmouseup; + window.dhtmlDragAndDrop.tempDOMM=document.body.onmousemove; + window.dhtmlDragAndDrop.dragStartNode=this; + window.dhtmlDragAndDrop.dragStartObject=this.dragStarter; + document.body.onmouseup=window.dhtmlDragAndDrop.preCreateDragCopy; + document.body.onmousemove=window.dhtmlDragAndDrop.callDrag; + window.dhtmlDragAndDrop.downtime = new Date().valueOf(); + + + if ((e)&&(e.preventDefault)){ + e.preventDefault(); + return false; + } + return false; +}; +dhtmlDragAndDropObject.prototype.callDrag=function(e){ + if (!e) + e=window.event; + dragger=window.dhtmlDragAndDrop; + if ((new Date()).valueOf()-dragger.downtime<100) return; + + if ((e.button == 0)&&(_isIE)) + return dragger.stopDrag(); + + if (!dragger.dragNode&&dragger.waitDrag){ + dragger.dragNode=dragger.dragStartObject._createDragNode(dragger.dragStartNode, e); + + if (!dragger.dragNode) + return dragger.stopDrag(); + + dragger.dragNode.onselectstart=function(){return false;} + dragger.gldragNode=dragger.dragNode; + document.body.appendChild(dragger.dragNode); + document.body.onmouseup=dragger.stopDrag; + dragger.waitDrag=0; + dragger.dragNode.pWindow=window; + dragger.initFrameRoute(); + } + + if (dragger.dragNode.parentNode != window.document.body){ + var grd = dragger.gldragNode; + + if (dragger.gldragNode.old) + grd=dragger.gldragNode.old; + + //if (!document.all) dragger.calculateFramePosition(); + grd.parentNode.removeChild(grd); + var oldBody = dragger.dragNode.pWindow; + + if (grd.pWindow && grd.pWindow.dhtmlDragAndDrop.lastLanding) + grd.pWindow.dhtmlDragAndDrop.lastLanding.dragLanding._dragOut(grd.pWindow.dhtmlDragAndDrop.lastLanding); + + // var oldp=dragger.dragNode.parentObject; + if (_isIE){ + var div = document.createElement("Div"); + div.innerHTML=dragger.dragNode.outerHTML; + dragger.dragNode=div.childNodes[0]; + } else + dragger.dragNode=dragger.dragNode.cloneNode(true); + + dragger.dragNode.pWindow=window; + // dragger.dragNode.parentObject=oldp; + + dragger.gldragNode.old=dragger.dragNode; + document.body.appendChild(dragger.dragNode); + oldBody.dhtmlDragAndDrop.dragNode=dragger.dragNode; + } + + dragger.dragNode.style.left=e.clientX+15+(dragger.fx + ? dragger.fx*(-1) + : 0) + +(document.body.scrollLeft||document.documentElement.scrollLeft)+"px"; + dragger.dragNode.style.top=e.clientY+3+(dragger.fy + ? dragger.fy*(-1) + : 0) + +(document.body.scrollTop||document.documentElement.scrollTop)+"px"; + + if (!e.srcElement) + var z = e.target; + else + z=e.srcElement; + dragger.checkLanding(z, e); +} + +dhtmlDragAndDropObject.prototype.calculateFramePosition=function(n){ + //this.fx = 0, this.fy = 0; + if (window.name){ + var el = parent.frames[window.name].frameElement.offsetParent; + var fx = 0; + var fy = 0; + + while (el){ + fx+=el.offsetLeft; + fy+=el.offsetTop; + el=el.offsetParent; + } + + if ((parent.dhtmlDragAndDrop)){ + var ls = parent.dhtmlDragAndDrop.calculateFramePosition(1); + fx+=ls.split('_')[0]*1; + fy+=ls.split('_')[1]*1; + } + + if (n) + return fx+"_"+fy; + else + this.fx=fx; + this.fy=fy; + } + return "0_0"; +} +dhtmlDragAndDropObject.prototype.checkLanding=function(htmlObject, e){ + if ((htmlObject)&&(htmlObject.dragLanding)){ + if (this.lastLanding) + this.lastLanding.dragLanding._dragOut(this.lastLanding); + this.lastLanding=htmlObject; + this.lastLanding=this.lastLanding.dragLanding._dragIn(this.lastLanding, this.dragStartNode, e.clientX, + e.clientY, e); + this.lastLanding_scr=(_isIE ? e.srcElement : e.target); + } else { + if ((htmlObject)&&(htmlObject.tagName != "BODY")) + this.checkLanding(htmlObject.parentNode, e); + else { + if (this.lastLanding) + this.lastLanding.dragLanding._dragOut(this.lastLanding, e.clientX, e.clientY, e); + this.lastLanding=0; + + if (this._onNotFound) + this._onNotFound(); + } + } +} +dhtmlDragAndDropObject.prototype.stopDrag=function(e, mode){ + dragger=window.dhtmlDragAndDrop; + + if (!mode){ + dragger.stopFrameRoute(); + var temp = dragger.lastLanding; + dragger.lastLanding=null; + + if (temp) + temp.dragLanding._drag(dragger.dragStartNode, dragger.dragStartObject, temp, (_isIE + ? event.srcElement + : e.target)); + } + dragger.lastLanding=null; + + if ((dragger.dragNode)&&(dragger.dragNode.parentNode == document.body)) + dragger.dragNode.parentNode.removeChild(dragger.dragNode); + dragger.dragNode=0; + dragger.gldragNode=0; + dragger.fx=0; + dragger.fy=0; + dragger.dragStartNode=0; + dragger.dragStartObject=0; + document.body.onmouseup=dragger.tempDOMU; + document.body.onmousemove=dragger.tempDOMM; + dragger.tempDOMU=null; + dragger.tempDOMM=null; + dragger.waitDrag=0; +} + +dhtmlDragAndDropObject.prototype.stopFrameRoute=function(win){ + if (win) + window.dhtmlDragAndDrop.stopDrag(1, 1); + + for (var i = 0; i < window.frames.length; i++){ + try{ + if ((window.frames[i] != win)&&(window.frames[i].dhtmlDragAndDrop)) + window.frames[i].dhtmlDragAndDrop.stopFrameRoute(window); + } catch(e){} + } + + try{ + if ((parent.dhtmlDragAndDrop)&&(parent != window)&&(parent != win)) + parent.dhtmlDragAndDrop.stopFrameRoute(window); + } catch(e){} +} +dhtmlDragAndDropObject.prototype.initFrameRoute=function(win, mode){ + if (win){ + window.dhtmlDragAndDrop.preCreateDragCopy(); + window.dhtmlDragAndDrop.dragStartNode=win.dhtmlDragAndDrop.dragStartNode; + window.dhtmlDragAndDrop.dragStartObject=win.dhtmlDragAndDrop.dragStartObject; + window.dhtmlDragAndDrop.dragNode=win.dhtmlDragAndDrop.dragNode; + window.dhtmlDragAndDrop.gldragNode=win.dhtmlDragAndDrop.dragNode; + window.document.body.onmouseup=window.dhtmlDragAndDrop.stopDrag; + window.waitDrag=0; + + if (((!_isIE)&&(mode))&&((!_isFF)||(_FFrv < 1.8))) + window.dhtmlDragAndDrop.calculateFramePosition(); + } + try{ + if ((parent.dhtmlDragAndDrop)&&(parent != window)&&(parent != win)) + parent.dhtmlDragAndDrop.initFrameRoute(window); + }catch(e){} + + for (var i = 0; i < window.frames.length; i++){ + try{ + if ((window.frames[i] != win)&&(window.frames[i].dhtmlDragAndDrop)) + window.frames[i].dhtmlDragAndDrop.initFrameRoute(window, ((!win||mode) ? 1 : 0)); + } catch(e){} + } +} + +var _isFF = false; +var _isIE = false; +var _isOpera = false; +var _isKHTML = false; +var _isMacOS = false; +var _isChrome = false; + +if (navigator.userAgent.indexOf('Macintosh') != -1) + _isMacOS=true; + + +if (navigator.userAgent.toLowerCase().indexOf('chrome')>-1) + _isChrome=true; + +if ((navigator.userAgent.indexOf('Safari') != -1)||(navigator.userAgent.indexOf('Konqueror') != -1)){ + var _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari')+7, 5)); + + if (_KHTMLrv > 525){ //mimic FF behavior for Safari 3.1+ + _isFF=true; + var _FFrv = 1.9; + } else + _isKHTML=true; +} else if (navigator.userAgent.indexOf('Opera') != -1){ + _isOpera=true; + _OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Opera')+6, 3)); +} + + +else if (navigator.appName.indexOf("Microsoft") != -1){ + _isIE=true; + if (navigator.appVersion.indexOf("MSIE 8.0")!= -1 && document.compatMode != "BackCompat") _isIE=8; +} else { + _isFF=true; + var _FFrv = parseFloat(navigator.userAgent.split("rv:")[1]) +} + + +//multibrowser Xpath processor +dtmlXMLLoaderObject.prototype.doXPath=function(xpathExp, docObj, namespace, result_type){ + if (_isKHTML || (!_isIE && !window.XPathResult)) + return this.doXPathOpera(xpathExp, docObj); + + if (_isIE){ //IE + if (!docObj) + if (!this.xmlDoc.nodeName) + docObj=this.xmlDoc.responseXML + else + docObj=this.xmlDoc; + + if (!docObj) + dhtmlxError.throwError("LoadXML", "Incorrect XML", [ + (docObj||this.xmlDoc), + this.mainObject + ]); + + if (namespace != null) + docObj.setProperty("SelectionNamespaces", "xmlns:xsl='"+namespace+"'"); // + + if (result_type == 'single'){ + return docObj.selectSingleNode(xpathExp); + } + else { + return docObj.selectNodes(xpathExp)||new Array(0); + } + } else { //Mozilla + var nodeObj = docObj; + + if (!docObj){ + if (!this.xmlDoc.nodeName){ + docObj=this.xmlDoc.responseXML + } + else { + docObj=this.xmlDoc; + } + } + + if (!docObj) + dhtmlxError.throwError("LoadXML", "Incorrect XML", [ + (docObj||this.xmlDoc), + this.mainObject + ]); + + if (docObj.nodeName.indexOf("document") != -1){ + nodeObj=docObj; + } + else { + nodeObj=docObj; + docObj=docObj.ownerDocument; + } + var retType = XPathResult.ANY_TYPE; + + if (result_type == 'single') + retType=XPathResult.FIRST_ORDERED_NODE_TYPE + var rowsCol = new Array(); + var col = docObj.evaluate(xpathExp, nodeObj, function(pref){ + return namespace + }, retType, null); + + if (retType == XPathResult.FIRST_ORDERED_NODE_TYPE){ + return col.singleNodeValue; + } + var thisColMemb = col.iterateNext(); + + while (thisColMemb){ + rowsCol[rowsCol.length]=thisColMemb; + thisColMemb=col.iterateNext(); + } + return rowsCol; + } +} + +function _dhtmlxError(type, name, params){ + if (!this.catches) + this.catches=new Array(); + + return this; +} + +_dhtmlxError.prototype.catchError=function(type, func_name){ + this.catches[type]=func_name; +} +_dhtmlxError.prototype.throwError=function(type, name, params){ + if (this.catches[type]) + return this.catches[type](type, name, params); + + if (this.catches["ALL"]) + return this.catches["ALL"](type, name, params); + + alert("Error type: "+arguments[0]+"\nDescription: "+arguments[1]); + return null; +} + +window.dhtmlxError=new _dhtmlxError(); + + +//opera fake, while 9.0 not released +//multibrowser Xpath processor +dtmlXMLLoaderObject.prototype.doXPathOpera=function(xpathExp, docObj){ + //this is fake for Opera + var z = xpathExp.replace(/[\/]+/gi, "/").split('/'); + var obj = null; + var i = 1; + + if (!z.length) + return []; + + if (z[0] == ".") + obj=[docObj]; else if (z[0] == ""){ + obj=(this.xmlDoc.responseXML||this.xmlDoc).getElementsByTagName(z[i].replace(/\[[^\]]*\]/g, "")); + i++; + } else + return []; + + for (i; i < z.length; i++)obj=this._getAllNamedChilds(obj, z[i]); + + if (z[i-1].indexOf("[") != -1) + obj=this._filterXPath(obj, z[i-1]); + return obj; +} + +dtmlXMLLoaderObject.prototype._filterXPath=function(a, b){ + var c = new Array(); + var b = b.replace(/[^\[]*\[\@/g, "").replace(/[\[\]\@]*/g, ""); + + for (var i = 0; i < a.length; i++) + if (a[i].getAttribute(b)) + c[c.length]=a[i]; + + return c; +} +dtmlXMLLoaderObject.prototype._getAllNamedChilds=function(a, b){ + var c = new Array(); + + if (_isKHTML) + b=b.toUpperCase(); + + for (var i = 0; i < a.length; i++)for (var j = 0; j < a[i].childNodes.length; j++){ + if (_isKHTML){ + if (a[i].childNodes[j].tagName&&a[i].childNodes[j].tagName.toUpperCase() == b) + c[c.length]=a[i].childNodes[j]; + } + + else if (a[i].childNodes[j].tagName == b) + c[c.length]=a[i].childNodes[j]; + } + + return c; +} + +function dhtmlXHeir(a, b){ + for (var c in b) + if (typeof (b[c]) == "function") + a[c]=b[c]; + return a; +} + +function dhtmlxEvent(el, event, handler){ + if (el.addEventListener) + el.addEventListener(event, handler, false); + + else if (el.attachEvent) + el.attachEvent("on"+event, handler); +} + +//============= XSL Extension =================================== + +dtmlXMLLoaderObject.prototype.xslDoc=null; +dtmlXMLLoaderObject.prototype.setXSLParamValue=function(paramName, paramValue, xslDoc){ + if (!xslDoc) + xslDoc=this.xslDoc + + if (xslDoc.responseXML) + xslDoc=xslDoc.responseXML; + var item = + this.doXPath("/xsl:stylesheet/xsl:variable[@name='"+paramName+"']", xslDoc, + "http:/\/www.w3.org/1999/XSL/Transform", "single"); + + if (item != null) + item.firstChild.nodeValue=paramValue +} +dtmlXMLLoaderObject.prototype.doXSLTransToObject=function(xslDoc, xmlDoc){ + if (!xslDoc) + xslDoc=this.xslDoc; + + if (xslDoc.responseXML) + xslDoc=xslDoc.responseXML + + if (!xmlDoc) + xmlDoc=this.xmlDoc; + + if (xmlDoc.responseXML) + xmlDoc=xmlDoc.responseXML + + //MOzilla + if (!_isIE){ + if (!this.XSLProcessor){ + this.XSLProcessor=new XSLTProcessor(); + this.XSLProcessor.importStylesheet(xslDoc); + } + var result = this.XSLProcessor.transformToDocument(xmlDoc); + } else { + var result = new ActiveXObject("Msxml2.DOMDocument.3.0"); + try{ + xmlDoc.transformNodeToObject(xslDoc, result); + }catch(e){ + result = xmlDoc.transformNode(xslDoc); + } + } + return result; +} + +dtmlXMLLoaderObject.prototype.doXSLTransToString=function(xslDoc, xmlDoc){ + var res = this.doXSLTransToObject(xslDoc, xmlDoc); + if(typeof(res)=="string") + return res; + return this.doSerialization(res); +} + +dtmlXMLLoaderObject.prototype.doSerialization=function(xmlDoc){ + if (!xmlDoc) + xmlDoc=this.xmlDoc; + if (xmlDoc.responseXML) + xmlDoc=xmlDoc.responseXML + if (!_isIE){ + var xmlSerializer = new XMLSerializer(); + return xmlSerializer.serializeToString(xmlDoc); + } else + return xmlDoc.xml; +} + +/** +* @desc: +* @type: private +*/ +dhtmlxEventable=function(obj){ + obj.attachEvent=function(name, catcher, callObj){ + name='ev_'+name.toLowerCase(); + if (!this[name]) + this[name]=new this.eventCatcher(callObj||this); + + return(name+':'+this[name].addEvent(catcher)); //return ID (event name & event ID) + } + obj.callEvent=function(name, arg0){ + name='ev_'+name.toLowerCase(); + if (this[name]) + return this[name].apply(this, arg0); + return true; + } + obj.checkEvent=function(name){ + return (!!this['ev_'+name.toLowerCase()]) + } + obj.eventCatcher=function(obj){ + var dhx_catch = []; + var z = function(){ + var res = true; + for (var i = 0; i < dhx_catch.length; i++){ + if (dhx_catch[i] != null){ + var zr = dhx_catch[i].apply(obj, arguments); + res=res&&zr; + } + } + return res; + } + z.addEvent=function(ev){ + if (typeof (ev) != "function") + ev=eval(ev); + if (ev) + return dhx_catch.push(ev)-1; + return false; + } + z.removeEvent=function(id){ + dhx_catch[id]=null; + } + return z; + } + obj.detachEvent=function(id){ + if (id != false){ + var list = id.split(':'); //get EventName and ID + this[list[0]].removeEvent(list[1]); //remove event + } + } + obj.detachAllEvents = function(){ + for (var name in this){ + if (name.indexOf("ev_")==0) + delete this[name]; + } + } +}
+ static/excanvas.min.js view
@@ -0,0 +1,1 @@+if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&").replace(/"/g,""")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z<j.length;Z++){this.initElement(j[Z])}},initElement:function(i){if(!i.getContext){i.getContext=T;r(i.ownerDocument);i.innerHTML="";i.attachEvent("onpropertychange",S);i.attachEvent("onresize",w);var Z=i.attributes;if(Z.width&&Z.width.specified){i.style.width=Z.width.nodeValue+"px"}else{i.width=i.clientWidth}if(Z.height&&Z.height.specified){i.style.height=Z.height.nodeValue+"px"}else{i.height=i.clientHeight}}return i}};function S(i){var Z=i.srcElement;switch(i.propertyName){case"width":Z.getContext().clearRect();Z.style.width=Z.attributes.width.nodeValue+"px";Z.firstChild.style.width=Z.clientWidth+"px";break;case"height":Z.getContext().clearRect();Z.style.height=Z.attributes.height.nodeValue+"px";Z.firstChild.style.height=Z.clientHeight+"px";break}}function w(i){var Z=i.srcElement;if(Z.firstChild){Z.firstChild.style.width=Z.clientWidth+"px";Z.firstChild.style.height=Z.clientHeight+"px"}}E.init();var I=[];for(var AC=0;AC<16;AC++){for(var AB=0;AB<16;AB++){I[AC*16+AB]=AC.toString(16)+AB.toString(16)}}function V(){return[[1,0,0],[0,1,0],[0,0,1]]}function d(m,j){var i=V();for(var Z=0;Z<3;Z++){for(var AF=0;AF<3;AF++){var p=0;for(var AE=0;AE<3;AE++){p+=m[Z][AE]*j[AE][AF]}i[Z][AF]=p}}return i}function Q(i,Z){Z.fillStyle=i.fillStyle;Z.lineCap=i.lineCap;Z.lineJoin=i.lineJoin;Z.lineWidth=i.lineWidth;Z.miterLimit=i.miterLimit;Z.shadowBlur=i.shadowBlur;Z.shadowColor=i.shadowColor;Z.shadowOffsetX=i.shadowOffsetX;Z.shadowOffsetY=i.shadowOffsetY;Z.strokeStyle=i.strokeStyle;Z.globalAlpha=i.globalAlpha;Z.font=i.font;Z.textAlign=i.textAlign;Z.textBaseline=i.textBaseline;Z.arcScaleX_=i.arcScaleX_;Z.arcScaleY_=i.arcScaleY_;Z.lineScale_=i.lineScale_}var B={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function g(i){var m=i.indexOf("(",3);var Z=i.indexOf(")",m+1);var j=i.substring(m+1,Z).split(",");if(j.length==4&&i.substr(3,1)=="a"){alpha=Number(j[3])}else{j[3]=1}return j}function C(Z){return parseFloat(Z)/100}function N(i,j,Z){return Math.min(Z,Math.max(j,i))}function c(AF){var j,i,Z;h=parseFloat(AF[0])/360%360;if(h<0){h++}s=N(C(AF[1]),0,1);l=N(C(AF[2]),0,1);if(s==0){j=i=Z=l}else{var m=l<0.5?l*(1+s):l+s-l*s;var AE=2*l-m;j=A(AE,m,h+1/3);i=A(AE,m,h);Z=A(AE,m,h-1/3)}return"#"+I[Math.floor(j*255)]+I[Math.floor(i*255)]+I[Math.floor(Z*255)]}function A(i,Z,j){if(j<0){j++}if(j>1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" <g_vml_:group",' coordsize="',D*Z,",",D*AE,'"',' coordorigin="0,0"',' style="width:',Z,"px;height:",AE,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var p=[];p.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",K(AW.x/D),",","Dy=",K(AW.y/D),"");var AS=AW;var AR=this.getCoords_(AH+AJ,AF);var AP=this.getCoords_(AH,AF+AV);var AL=this.getCoords_(AH+AJ,AF+AV);AS.x=z.max(AS.x,AR.x,AP.x,AL.x);AS.y=z.max(AS.y,AR.y,AP.y,AL.y);AU.push("padding:0 ",K(AS.x/D),"px ",K(AS.y/D),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",p.join(""),", sizingmethod='clip');")}else{AU.push("top:",K(AW.y/D),"px;left:",K(AW.x/D),"px;")}AU.push(' ">','<g_vml_:image src="',AO.src,'"',' style="width:',D*AJ,"px;"," height:",D*AV,'px"',' cropleft="',AM/AG,'"',' croptop="',AK/AT,'"',' cropright="',(AG-AM-AQ)/AG,'"',' cropbottom="',(AT-AK-AX)/AT,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AH<this.currentPath_.length;AH+=AE){var AK=[];var AF=false;AK.push("<g_vml_:shape",' filled="',!!AM,'"',' style="position:absolute;width:',m,"px;height:",AN,'px;"',' coordorigin="0,0"',' coordsize="',D*m,",",D*AN,'"',' stroked="',!AM,'"',' path="');var AO=false;for(var AI=AH;AI<Math.min(AH+AE,this.currentPath_.length);AI++){if(AI%AE==0&&AI>0){AK.push(" m ",K(this.currentPath_[AI-1].x),",",K(this.currentPath_[AI-1].y))}var Z=this.currentPath_[AI];var AJ;switch(Z.type){case"moveTo":AJ=Z;AK.push(" m ",K(Z.x),",",K(Z.y));break;case"lineTo":AK.push(" l ",K(Z.x),",",K(Z.y));break;case"close":AK.push(" x ");Z=null;break;case"bezierCurveTo":AK.push(" c ",K(Z.cp1x),",",K(Z.cp1y),",",K(Z.cp2x),",",K(Z.cp2y),",",K(Z.x),",",K(Z.y));break;case"at":case"wa":AK.push(" ",Z.type," ",K(Z.x-this.arcScaleX_*Z.radius),",",K(Z.y-this.arcScaleY_*Z.radius)," ",K(Z.x+this.arcScaleX_*Z.radius),",",K(Z.y+this.arcScaleY_*Z.radius)," ",K(Z.xStart),",",K(Z.yStart)," ",K(Z.xEnd),",",K(Z.yEnd));break}if(Z){if(AG.x==null||Z.x<AG.x){AG.x=Z.x}if(AL.x==null||Z.x>AL.x){AL.x=Z.x}if(AG.y==null||Z.y<AG.y){AG.y=Z.y}if(AL.y==null||Z.y>AL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("<g_vml_:stroke",' opacity="',p,'"',' joinstyle="',j.lineJoin,'"',' miterlimit="',j.miterLimit,'"',' endcap="',t(j.lineCap),'"',' weight="',Z,'px"',' color="',m,'" />')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae<AN;Ae++){var AM=AS[Ae];Ab.push(AM.offset*AK+AU+" "+AM.color)}AG.push('<g_vml_:fill type="',AH.type_,'"',' method="none" focus="100%"',' color="',AR,'"',' color2="',AQ,'"',' colors="',Ab.join(","),'"',' opacity="',AV,'"',' g_o_:opacity2="',AW,'"',' angle="',AL,'"',' focusposition="',Ac.x,",",Ac.y,'" />')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("<g_vml_:fill",' position="',AF/Z*AY*AY,",",AZ/m*AX*AX,'"',' type="tile"',' src="',AH.src_,'" />')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('<g_vml_:fill color="',AT,'" opacity="',Ad,'" />')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('<g_vml_:line from="',-i,' 0" to="',AP,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!AG,'" stroked="',!!AG,'" style="position:absolute;width:1px;height:1px;">');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('<g_vml_:skew on="t" matrix="',AL,'" ',' offset="',AJ,'" origin="',i,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',AD(AK),'" style="v-text-align:',p,";font:",AD(j),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()};
+ static/favicon.ico view
binary file changed (absent → 1150 bytes)
+ static/hledger.js view
@@ -0,0 +1,177 @@+/* hledger web ui javascripts */+/* depends on jquery, other support libs, and additional js inserted inline */++$(document).ready(function() {++ /* show/hide things based on request parameters */+ if ($.url.param('add')) addformToggle();+ else if ($.url.param('edit')) editformToggle();+ if ($.url.param('accounts')=='0') $('#accounts').hide();++ /* set up sidebar account mouse-over handlers */+ $('.balancereport td a').mouseenter(function(){ $(this).parent().addClass('mouseover'); });+ $('.balancereport td').mouseleave(function(){ $(this).removeClass('mouseover'); });++ /* set up various show/hide toggles */+ $('#search-help-link').click(function() { $('#search-help').slideToggle('fast'); event.preventDefault(); });+ $('#accounts-toggle-link').click(function() { $('#accounts').slideToggle('fast'); event.preventDefault(); });+ $('#all-postings-toggle-link').click(function() { $('.posting').toggle(); event.preventDefault(); });+ $('.postings-toggle-link').click(function() { $(this).parent().parent().nextUntil(':not(.posting)').toggle(); event.preventDefault(); });++});++function searchformToggle() {+ var a = document.getElementById('addform');+ var e = document.getElementById('editform');+ var f = document.getElementById('searchform');+ var i = document.getElementById('importform');+ var c = document.getElementById('maincontent');+ var alink = document.getElementById('addformlink');+ var elink = document.getElementById('editformlink');+ var flink = document.getElementById('searchformlink');+ var ilink = document.getElementById('importformlink');+ var tlink = document.getElementById('transactionslink');++ if (f.style.display == 'none') {+ flink.style['font-weight'] = 'bold';+ f.style.display = 'block';+ } else {+ flink.style['font-weight'] = 'normal';+ f.style.display = 'none';+ }+ return false;+}++function addformToggle(ev) {+ var a = document.getElementById('addform');+ var e = document.getElementById('editform');+ var f = document.getElementById('searchform');+ var i = document.getElementById('importform');+ var c = document.getElementById('maincontent');+ var alink = document.getElementById('addformlink');+ var elink = document.getElementById('editformlink');+ var flink = document.getElementById('searchformlink');+ var ilink = document.getElementById('importformlink');+ var tlink = document.getElementById('transactionslink');++ if (a.style.display == 'none') {+ if (alink) alink.style['font-weight'] = 'bold';+ if (elink) elink.style['font-weight'] = 'normal';+ if (ilink) ilink.style['font-weight'] = 'normal';+ if (tlink) tlink.style['font-weight'] = 'normal';+ if (a) a.style.display = 'block';+ if (e) e.style.display = 'none';+ if (i) i.style.display = 'none';+ if (c) c.style.display = 'none';+ } else {+ if (alink) alink.style['font-weight'] = 'normal';+ if (elink) elink.style['font-weight'] = 'normal';+ if (ilink) ilink.style['font-weight'] = 'normal';+ if (tlink) tlink.style['font-weight'] = 'bold';+ if (a) a.style.display = 'none';+ if (e) e.style.display = 'none';+ if (i) i.style.display = 'none';+ if (c) c.style.display = 'block';+ }+ return false;+}++function editformToggle(ev) {+ var a = document.getElementById('addform');+ var e = document.getElementById('editform');+ var ej = document.getElementById('journalselect');+ var f = document.getElementById('searchform');+ var i = document.getElementById('importform');+ var c = document.getElementById('maincontent');+ var alink = document.getElementById('addformlink');+ var elink = document.getElementById('editformlink');+ var flink = document.getElementById('searchformlink');+ var ilink = document.getElementById('importformlink');+ var tlink = document.getElementById('transactionslink');++ if (e.style.display == 'none') {+ if (alink) alink.style['font-weight'] = 'normal';+ if (elink) elink.style['font-weight'] = 'bold';+ if (ilink) ilink.style['font-weight'] = 'normal';+ if (tlink) tlink.style['font-weight'] = 'normal';+ if (a) a.style.display = 'none';+ if (i) i.style.display = 'none';+ if (c) c.style.display = 'none';+ if (e) e.style.display = 'block';+ editformJournalSelect(ev);+ } else {+ if (alink) alink.style['font-weight'] = 'normal';+ if (elink) elink.style['font-weight'] = 'normal';+ if (ilink) ilink.style['font-weight'] = 'normal';+ if (tlink) tlink.style['font-weight'] = 'bold';+ if (a) a.style.display = 'none';+ if (e) e.style.display = 'none';+ if (i) i.style.display = 'none';+ if (c) c.style.display = 'block';+ }+ return false;+}++// Get the current event's target in a robust way.+// http://www.quirksmode.org/js/events_properties.html+function getTarget(ev) {+ var targ;+ if (!ev) var ev = window.event;+ if (ev.target) targ = ev.target;+ else if (ev.srcElement) targ = ev.srcElement;+ if (targ.nodeType == 3) targ = targ.parentNode;+ return targ;+}++function editformJournalSelect(ev) {+ var textareas = $('textarea', $('form#editform'));+ for (i=0; i<textareas.length; i++) {+ textareas[i].style.display = 'none';+ textareas[i].disabled = true;+ }+ var targ = getTarget(ev);+ if (targ.value) {+ var journalid = targ.value+'_textarea';+ var textarea = document.getElementById(journalid);+ }+ else {+ var textarea = textareas[0];+ }+ textarea.style.display = 'block';+ textarea.disabled = false;+ return true;+}++function importformToggle(ev) {+ var a = document.getElementById('addform');+ var e = document.getElementById('editform');+ var f = document.getElementById('searchform');+ var i = document.getElementById('importform');+ var c = document.getElementById('maincontent');+ var alink = document.getElementById('addformlink');+ var elink = document.getElementById('editformlink');+ var flink = document.getElementById('searchformlink');+ var ilink = document.getElementById('importformlink');+ var tlink = document.getElementById('transactionslink');++ if (i.style.display == 'none') {+ if (alink) alink.style['font-weight'] = 'normal';+ if (elink) elink.style['font-weight'] = 'normal';+ if (ilink) ilink.style['font-weight'] = 'bold';+ if (tlink) tlink.style['font-weight'] = 'normal';+ if (a) a.style.display = 'none';+ if (e) e.style.display = 'none';+ if (i) i.style.display = 'block';+ if (c) c.style.display = 'none';+ } else {+ if (alink) alink.style['font-weight'] = 'normal';+ if (elink) elink.style['font-weight'] = 'normal';+ if (ilink) ilink.style['font-weight'] = 'normal';+ if (tlink) tlink.style['font-weight'] = 'bold';+ if (a) a.style.display = 'none';+ if (e) e.style.display = 'none';+ if (i) i.style.display = 'none';+ if (c) c.style.display = 'block';+ }+ return false;+}
+ static/jquery.flot.js view
@@ -0,0 +1,2599 @@+/*! Javascript plotting library for jQuery, v. 0.7.+ *+ * Released under the MIT license by IOLA, December 2007.+ *+ */++// first an inline dependency, jquery.colorhelpers.js, we inline it here+// for convenience++/* Plugin for jQuery for working with colors.+ * + * Version 1.1.+ * + * Inspiration from jQuery color animation plugin by John Resig.+ *+ * Released under the MIT license by Ole Laursen, October 2009.+ *+ * Examples:+ *+ * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()+ * var c = $.color.extract($("#mydiv"), 'background-color');+ * console.log(c.r, c.g, c.b, c.a);+ * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"+ *+ * Note that .scale() and .add() return the same modified object+ * instead of making a new one.+ *+ * V. 1.1: Fix error handling so e.g. parsing an empty string does+ * produce a color rather than just crashing.+ */ +(function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]+=I}return G.normalize()};G.scale=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]*=I}return G.normalize()};G.toString=function(){if(G.a>=1){return"rgb("+[G.r,G.g,G.b].join(",")+")"}else{return"rgba("+[G.r,G.g,G.b,G.a].join(",")+")"}};G.normalize=function(){function H(J,K,I){return K<J?J:(K>I?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=""&&E!="transparent"){break}D=D.parent()}while(!B.nodeName(D.get(0),"body"));if(E=="rgba(0, 0, 0, 0)"){E="transparent"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D=="transparent"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],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],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);++// the actual Flot code+(function($) {+ function Plot(placeholder, data_, options_, plugins) {+ // data is on the form:+ // [ series1, series2 ... ]+ // where series is either just the data as [ [x1, y1], [x2, y2], ... ]+ // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... }+ + var series = [],+ options = {+ // the color theme used for graphs+ colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"],+ legend: {+ show: true,+ noColumns: 1, // number of colums in legend table+ labelFormatter: null, // fn: string -> string+ labelBoxBorderColor: "#ccc", // border color for the little label boxes+ container: null, // container (as jQuery object) to put legend in, null means default on top of graph+ position: "ne", // position of default legend container within plot+ margin: 5, // distance from grid edge to default legend container within plot+ backgroundColor: null, // null means auto-detect+ backgroundOpacity: 0.85 // set to 0 to avoid background+ },+ xaxis: {+ show: null, // null = auto-detect, true = always, false = never+ position: "bottom", // or "top"+ mode: null, // null or "time"+ color: null, // base color, labels, ticks+ tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)"+ transform: null, // null or f: number -> number to transform axis+ inverseTransform: null, // if transform is set, this should be the inverse function+ min: null, // min. value to show, null means set automatically+ max: null, // max. value to show, null means set automatically+ autoscaleMargin: null, // margin in % to add if auto-setting min/max+ ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks+ tickFormatter: null, // fn: number -> string+ labelWidth: null, // size of tick labels in pixels+ labelHeight: null,+ reserveSpace: null, // whether to reserve space even if axis isn't shown+ tickLength: null, // size in pixels of ticks, or "full" for whole line+ alignTicksWithAxis: null, // axis number or null for no sync+ + // mode specific options+ tickDecimals: null, // no. of decimals, null means auto+ tickSize: null, // number or [number, "unit"]+ minTickSize: null, // number or [number, "unit"]+ monthNames: null, // list of names of months+ timeformat: null, // format string to use+ twelveHourClock: false // 12 or 24 time in time mode+ },+ yaxis: {+ autoscaleMargin: 0.02,+ position: "left" // or "right"+ },+ xaxes: [],+ yaxes: [],+ series: {+ points: {+ show: false,+ radius: 3,+ lineWidth: 2, // in pixels+ fill: true,+ fillColor: "#ffffff",+ symbol: "circle" // or callback+ },+ lines: {+ // we don't put in show: false so we can see+ // whether lines were actively disabled + lineWidth: 2, // in pixels+ fill: false,+ fillColor: null,+ steps: false+ },+ bars: {+ show: false,+ lineWidth: 2, // in pixels+ barWidth: 1, // in units of the x axis+ fill: true,+ fillColor: null,+ align: "left", // or "center" + horizontal: false+ },+ shadowSize: 3+ },+ grid: {+ show: true,+ aboveData: false,+ color: "#545454", // primary color used for outline and labels+ backgroundColor: null, // null for transparent, else color+ borderColor: null, // set if different from the grid color+ tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)"+ labelMargin: 5, // in pixels+ axisMargin: 8, // in pixels+ borderWidth: 2, // in pixels+ minBorderMargin: null, // in pixels, null means taken from points radius+ markings: null, // array of ranges or fn: axes -> array of ranges+ markingsColor: "#f4f4f4",+ markingsLineWidth: 2,+ // interactive stuff+ clickable: false,+ hoverable: false,+ autoHighlight: true, // highlight in case mouse is near+ mouseActiveRadius: 10 // how far the mouse can be away to activate an item+ },+ hooks: {}+ },+ canvas = null, // the canvas for the plot itself+ overlay = null, // canvas for interactive stuff on top of plot+ eventHolder = null, // jQuery object that events should be bound to+ ctx = null, octx = null,+ xaxes = [], yaxes = [],+ plotOffset = { left: 0, right: 0, top: 0, bottom: 0},+ canvasWidth = 0, canvasHeight = 0,+ plotWidth = 0, plotHeight = 0,+ hooks = {+ processOptions: [],+ processRawData: [],+ processDatapoints: [],+ drawSeries: [],+ draw: [],+ bindEvents: [],+ drawOverlay: [],+ shutdown: []+ },+ plot = this;++ // public functions+ plot.setData = setData;+ plot.setupGrid = setupGrid;+ plot.draw = draw;+ plot.getPlaceholder = function() { return placeholder; };+ plot.getCanvas = function() { return canvas; };+ plot.getPlotOffset = function() { return plotOffset; };+ plot.width = function () { return plotWidth; };+ plot.height = function () { return plotHeight; };+ plot.offset = function () {+ var o = eventHolder.offset();+ o.left += plotOffset.left;+ o.top += plotOffset.top;+ return o;+ };+ plot.getData = function () { return series; };+ plot.getAxes = function () {+ var res = {}, i;+ $.each(xaxes.concat(yaxes), function (_, axis) {+ if (axis)+ res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis;+ });+ return res;+ };+ plot.getXAxes = function () { return xaxes; };+ plot.getYAxes = function () { return yaxes; };+ plot.c2p = canvasToAxisCoords;+ plot.p2c = axisToCanvasCoords;+ plot.getOptions = function () { return options; };+ plot.highlight = highlight;+ plot.unhighlight = unhighlight;+ plot.triggerRedrawOverlay = triggerRedrawOverlay;+ plot.pointOffset = function(point) {+ return {+ left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left),+ top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top)+ };+ };+ plot.shutdown = shutdown;+ plot.resize = function () {+ getCanvasDimensions();+ resizeCanvas(canvas);+ resizeCanvas(overlay);+ };++ // public attributes+ plot.hooks = hooks;+ + // initialize+ initPlugins(plot);+ parseOptions(options_);+ setupCanvases();+ setData(data_);+ setupGrid();+ draw();+ bindEvents();+++ function executeHooks(hook, args) {+ args = [plot].concat(args);+ for (var i = 0; i < hook.length; ++i)+ hook[i].apply(this, args);+ }++ function initPlugins() {+ for (var i = 0; i < plugins.length; ++i) {+ var p = plugins[i];+ p.init(plot);+ if (p.options)+ $.extend(true, options, p.options);+ }+ }+ + function parseOptions(opts) {+ var i;+ + $.extend(true, options, opts);+ + if (options.xaxis.color == null)+ options.xaxis.color = options.grid.color;+ if (options.yaxis.color == null)+ options.yaxis.color = options.grid.color;+ + if (options.xaxis.tickColor == null) // backwards-compatibility+ options.xaxis.tickColor = options.grid.tickColor;+ if (options.yaxis.tickColor == null) // backwards-compatibility+ options.yaxis.tickColor = options.grid.tickColor;++ if (options.grid.borderColor == null)+ options.grid.borderColor = options.grid.color;+ if (options.grid.tickColor == null)+ options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();+ + // fill in defaults in axes, copy at least always the+ // first as the rest of the code assumes it'll be there+ for (i = 0; i < Math.max(1, options.xaxes.length); ++i)+ options.xaxes[i] = $.extend(true, {}, options.xaxis, options.xaxes[i]);+ for (i = 0; i < Math.max(1, options.yaxes.length); ++i)+ options.yaxes[i] = $.extend(true, {}, options.yaxis, options.yaxes[i]);++ // backwards compatibility, to be removed in future+ if (options.xaxis.noTicks && options.xaxis.ticks == null)+ options.xaxis.ticks = options.xaxis.noTicks;+ if (options.yaxis.noTicks && options.yaxis.ticks == null)+ options.yaxis.ticks = options.yaxis.noTicks;+ if (options.x2axis) {+ options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);+ options.xaxes[1].position = "top";+ }+ if (options.y2axis) {+ options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);+ options.yaxes[1].position = "right";+ }+ if (options.grid.coloredAreas)+ options.grid.markings = options.grid.coloredAreas;+ if (options.grid.coloredAreasColor)+ options.grid.markingsColor = options.grid.coloredAreasColor;+ if (options.lines)+ $.extend(true, options.series.lines, options.lines);+ if (options.points)+ $.extend(true, options.series.points, options.points);+ if (options.bars)+ $.extend(true, options.series.bars, options.bars);+ if (options.shadowSize != null)+ options.series.shadowSize = options.shadowSize;++ // save options on axes for future reference+ for (i = 0; i < options.xaxes.length; ++i)+ getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];+ for (i = 0; i < options.yaxes.length; ++i)+ getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];++ // add hooks from options+ for (var n in hooks)+ if (options.hooks[n] && options.hooks[n].length)+ hooks[n] = hooks[n].concat(options.hooks[n]);++ executeHooks(hooks.processOptions, [options]);+ }++ function setData(d) {+ series = parseData(d);+ fillInSeriesOptions();+ processData();+ }+ + function parseData(d) {+ var res = [];+ for (var i = 0; i < d.length; ++i) {+ var s = $.extend(true, {}, options.series);++ if (d[i].data != null) {+ s.data = d[i].data; // move the data instead of deep-copy+ delete d[i].data;++ $.extend(true, s, d[i]);++ d[i].data = s.data;+ }+ else+ s.data = d[i];+ res.push(s);+ }++ return res;+ }+ + function axisNumber(obj, coord) {+ var a = obj[coord + "axis"];+ if (typeof a == "object") // if we got a real axis, extract number+ a = a.n;+ if (typeof a != "number")+ a = 1; // default to first axis+ return a;+ }++ function allAxes() {+ // return flat array without annoying null entries+ return $.grep(xaxes.concat(yaxes), function (a) { return a; });+ }+ + function canvasToAxisCoords(pos) {+ // return an object with x/y corresponding to all used axes + var res = {}, i, axis;+ for (i = 0; i < xaxes.length; ++i) {+ axis = xaxes[i];+ if (axis && axis.used)+ res["x" + axis.n] = axis.c2p(pos.left);+ }++ for (i = 0; i < yaxes.length; ++i) {+ axis = yaxes[i];+ if (axis && axis.used)+ res["y" + axis.n] = axis.c2p(pos.top);+ }+ + if (res.x1 !== undefined)+ res.x = res.x1;+ if (res.y1 !== undefined)+ res.y = res.y1;++ return res;+ }+ + function axisToCanvasCoords(pos) {+ // get canvas coords from the first pair of x/y found in pos+ var res = {}, i, axis, key;++ for (i = 0; i < xaxes.length; ++i) {+ axis = xaxes[i];+ if (axis && axis.used) {+ key = "x" + axis.n;+ if (pos[key] == null && axis.n == 1)+ key = "x";++ if (pos[key] != null) {+ res.left = axis.p2c(pos[key]);+ break;+ }+ }+ }+ + for (i = 0; i < yaxes.length; ++i) {+ axis = yaxes[i];+ if (axis && axis.used) {+ key = "y" + axis.n;+ if (pos[key] == null && axis.n == 1)+ key = "y";++ if (pos[key] != null) {+ res.top = axis.p2c(pos[key]);+ break;+ }+ }+ }+ + return res;+ }+ + function getOrCreateAxis(axes, number) {+ if (!axes[number - 1])+ axes[number - 1] = {+ n: number, // save the number for future reference+ direction: axes == xaxes ? "x" : "y",+ options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)+ };+ + return axes[number - 1];+ }++ function fillInSeriesOptions() {+ var i;+ + // collect what we already got of colors+ var neededColors = series.length,+ usedColors = [],+ assignedColors = [];+ for (i = 0; i < series.length; ++i) {+ var sc = series[i].color;+ if (sc != null) {+ --neededColors;+ if (typeof sc == "number")+ assignedColors.push(sc);+ else+ usedColors.push($.color.parse(series[i].color));+ }+ }+ + // we might need to generate more colors if higher indices+ // are assigned+ for (i = 0; i < assignedColors.length; ++i) {+ neededColors = Math.max(neededColors, assignedColors[i] + 1);+ }++ // produce colors as needed+ var colors = [], variation = 0;+ i = 0;+ while (colors.length < neededColors) {+ var c;+ if (options.colors.length == i) // check degenerate case+ c = $.color.make(100, 100, 100);+ else+ c = $.color.parse(options.colors[i]);++ // vary color if needed+ var sign = variation % 2 == 1 ? -1 : 1;+ c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2)++ // FIXME: if we're getting to close to something else,+ // we should probably skip this one+ colors.push(c);+ + ++i;+ if (i >= options.colors.length) {+ i = 0;+ ++variation;+ }+ }++ // fill in the options+ var colori = 0, s;+ for (i = 0; i < series.length; ++i) {+ s = series[i];+ + // assign colors+ if (s.color == null) {+ s.color = colors[colori].toString();+ ++colori;+ }+ else if (typeof s.color == "number")+ s.color = colors[s.color].toString();++ // turn on lines automatically in case nothing is set+ if (s.lines.show == null) {+ var v, show = true;+ for (v in s)+ if (s[v] && s[v].show) {+ show = false;+ break;+ }+ if (show)+ s.lines.show = true;+ }++ // setup axes+ s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x"));+ s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y"));+ }+ }+ + function processData() {+ var topSentry = Number.POSITIVE_INFINITY,+ bottomSentry = Number.NEGATIVE_INFINITY,+ fakeInfinity = Number.MAX_VALUE,+ i, j, k, m, length,+ s, points, ps, x, y, axis, val, f, p;++ function updateAxis(axis, min, max) {+ if (min < axis.datamin && min != -fakeInfinity)+ axis.datamin = min;+ if (max > axis.datamax && max != fakeInfinity)+ axis.datamax = max;+ }++ $.each(allAxes(), function (_, axis) {+ // init axis+ axis.datamin = topSentry;+ axis.datamax = bottomSentry;+ axis.used = false;+ });+ + for (i = 0; i < series.length; ++i) {+ s = series[i];+ s.datapoints = { points: [] };+ + executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);+ }+ + // first pass: clean and copy data+ for (i = 0; i < series.length; ++i) {+ s = series[i];++ var data = s.data, format = s.datapoints.format;++ if (!format) {+ format = [];+ // find out how to copy+ format.push({ x: true, number: true, required: true });+ format.push({ y: true, number: true, required: true });++ if (s.bars.show || (s.lines.show && s.lines.fill)) {+ format.push({ y: true, number: true, required: false, defaultValue: 0 });+ if (s.bars.horizontal) {+ delete format[format.length - 1].y;+ format[format.length - 1].x = true;+ }+ }+ + s.datapoints.format = format;+ }++ if (s.datapoints.pointsize != null)+ continue; // already filled in++ s.datapoints.pointsize = format.length;+ + ps = s.datapoints.pointsize;+ points = s.datapoints.points;++ insertSteps = s.lines.show && s.lines.steps;+ s.xaxis.used = s.yaxis.used = true;+ + for (j = k = 0; j < data.length; ++j, k += ps) {+ p = data[j];++ var nullify = p == null;+ if (!nullify) {+ for (m = 0; m < ps; ++m) {+ val = p[m];+ f = format[m];++ if (f) {+ if (f.number && val != null) {+ val = +val; // convert to number+ if (isNaN(val))+ val = null;+ else if (val == Infinity)+ val = fakeInfinity;+ else if (val == -Infinity)+ val = -fakeInfinity;+ }++ if (val == null) {+ if (f.required)+ nullify = true;+ + if (f.defaultValue != null)+ val = f.defaultValue;+ }+ }+ + points[k + m] = val;+ }+ }+ + if (nullify) {+ for (m = 0; m < ps; ++m) {+ val = points[k + m];+ if (val != null) {+ f = format[m];+ // extract min/max info+ if (f.x)+ updateAxis(s.xaxis, val, val);+ if (f.y)+ updateAxis(s.yaxis, val, val);+ }+ points[k + m] = null;+ }+ }+ else {+ // a little bit of line specific stuff that+ // perhaps shouldn't be here, but lacking+ // better means...+ if (insertSteps && k > 0+ && points[k - ps] != null+ && points[k - ps] != points[k]+ && points[k - ps + 1] != points[k + 1]) {+ // copy the point to make room for a middle point+ for (m = 0; m < ps; ++m)+ points[k + ps + m] = points[k + m];++ // middle point has same y+ points[k + 1] = points[k - ps + 1];++ // we've added a point, better reflect that+ k += ps;+ }+ }+ }+ }++ // give the hooks a chance to run+ for (i = 0; i < series.length; ++i) {+ s = series[i];+ + executeHooks(hooks.processDatapoints, [ s, s.datapoints]);+ }++ // second pass: find datamax/datamin for auto-scaling+ for (i = 0; i < series.length; ++i) {+ s = series[i];+ points = s.datapoints.points,+ ps = s.datapoints.pointsize;++ var xmin = topSentry, ymin = topSentry,+ xmax = bottomSentry, ymax = bottomSentry;+ + for (j = 0; j < points.length; j += ps) {+ if (points[j] == null)+ continue;++ for (m = 0; m < ps; ++m) {+ val = points[j + m];+ f = format[m];+ if (!f || val == fakeInfinity || val == -fakeInfinity)+ continue;+ + if (f.x) {+ if (val < xmin)+ xmin = val;+ if (val > xmax)+ xmax = val;+ }+ if (f.y) {+ if (val < ymin)+ ymin = val;+ if (val > ymax)+ ymax = val;+ }+ }+ }+ + if (s.bars.show) {+ // make sure we got room for the bar on the dancing floor+ var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2;+ if (s.bars.horizontal) {+ ymin += delta;+ ymax += delta + s.bars.barWidth;+ }+ else {+ xmin += delta;+ xmax += delta + s.bars.barWidth;+ }+ }+ + updateAxis(s.xaxis, xmin, xmax);+ updateAxis(s.yaxis, ymin, ymax);+ }++ $.each(allAxes(), function (_, axis) {+ if (axis.datamin == topSentry)+ axis.datamin = null;+ if (axis.datamax == bottomSentry)+ axis.datamax = null;+ });+ }++ function makeCanvas(skipPositioning, cls) {+ var c = document.createElement('canvas');+ c.className = cls;+ c.width = canvasWidth;+ c.height = canvasHeight;+ + if (!skipPositioning)+ $(c).css({ position: 'absolute', left: 0, top: 0 });+ + $(c).appendTo(placeholder);+ + if (!c.getContext) // excanvas hack+ c = window.G_vmlCanvasManager.initElement(c);++ // used for resetting in case we get replotted+ c.getContext("2d").save();+ + return c;+ }++ function getCanvasDimensions() {+ canvasWidth = placeholder.width();+ canvasHeight = placeholder.height();+ + if (canvasWidth <= 0 || canvasHeight <= 0)+ throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight;+ }++ function resizeCanvas(c) {+ // resizing should reset the state (excanvas seems to be+ // buggy though)+ if (c.width != canvasWidth)+ c.width = canvasWidth;++ if (c.height != canvasHeight)+ c.height = canvasHeight;++ // so try to get back to the initial state (even if it's+ // gone now, this should be safe according to the spec)+ var cctx = c.getContext("2d");+ cctx.restore();++ // and save again+ cctx.save();+ }+ + function setupCanvases() {+ var reused,+ existingCanvas = placeholder.children("canvas.base"),+ existingOverlay = placeholder.children("canvas.overlay");++ if (existingCanvas.length == 0 || existingOverlay == 0) {+ // init everything+ + placeholder.html(""); // make sure placeholder is clear+ + placeholder.css({ padding: 0 }); // padding messes up the positioning+ + if (placeholder.css("position") == 'static')+ placeholder.css("position", "relative"); // for positioning labels and overlay++ getCanvasDimensions();+ + canvas = makeCanvas(true, "base");+ overlay = makeCanvas(false, "overlay"); // overlay canvas for interactive features++ reused = false;+ }+ else {+ // reuse existing elements++ canvas = existingCanvas.get(0);+ overlay = existingOverlay.get(0);++ reused = true;+ }++ ctx = canvas.getContext("2d");+ octx = overlay.getContext("2d");++ // we include the canvas in the event holder too, because IE 7+ // sometimes has trouble with the stacking order+ eventHolder = $([overlay, canvas]);++ if (reused) {+ // run shutdown in the old plot object+ placeholder.data("plot").shutdown();++ // reset reused canvases+ plot.resize();+ + // make sure overlay pixels are cleared (canvas is cleared when we redraw)+ octx.clearRect(0, 0, canvasWidth, canvasHeight);+ + // then whack any remaining obvious garbage left+ eventHolder.unbind();+ placeholder.children().not([canvas, overlay]).remove();+ }++ // save in case we get replotted+ placeholder.data("plot", plot);+ }++ function bindEvents() {+ // bind events+ if (options.grid.hoverable) {+ eventHolder.mousemove(onMouseMove);+ eventHolder.mouseleave(onMouseLeave);+ }++ if (options.grid.clickable)+ eventHolder.click(onClick);++ executeHooks(hooks.bindEvents, [eventHolder]);+ }++ function shutdown() {+ if (redrawTimeout)+ clearTimeout(redrawTimeout);+ + eventHolder.unbind("mousemove", onMouseMove);+ eventHolder.unbind("mouseleave", onMouseLeave);+ eventHolder.unbind("click", onClick);+ + executeHooks(hooks.shutdown, [eventHolder]);+ }++ function setTransformationHelpers(axis) {+ // set helper functions on the axis, assumes plot area+ // has been computed already+ + function identity(x) { return x; }+ + var s, m, t = axis.options.transform || identity,+ it = axis.options.inverseTransform;+ + // precompute how much the axis is scaling a point+ // in canvas space+ if (axis.direction == "x") {+ s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));+ m = Math.min(t(axis.max), t(axis.min));+ }+ else {+ s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));+ s = -s;+ m = Math.max(t(axis.max), t(axis.min));+ }++ // data point to canvas coordinate+ if (t == identity) // slight optimization+ axis.p2c = function (p) { return (p - m) * s; };+ else+ axis.p2c = function (p) { return (t(p) - m) * s; };+ // canvas coordinate to data point+ if (!it)+ axis.c2p = function (c) { return m + c / s; };+ else+ axis.c2p = function (c) { return it(m + c / s); };+ }++ function measureTickLabels(axis) {+ var opts = axis.options, i, ticks = axis.ticks || [], labels = [],+ l, w = opts.labelWidth, h = opts.labelHeight, dummyDiv;++ function makeDummyDiv(labels, width) {+ return $('<div style="position:absolute;top:-10000px;' + width + 'font-size:smaller">' ++ '<div class="' + axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis">'+ + labels.join("") + '</div></div>')+ .appendTo(placeholder);+ }+ + if (axis.direction == "x") {+ // to avoid measuring the widths of the labels (it's slow), we+ // construct fixed-size boxes and put the labels inside+ // them, we don't need the exact figures and the+ // fixed-size box content is easy to center+ if (w == null)+ w = Math.floor(canvasWidth / (ticks.length > 0 ? ticks.length : 1));++ // measure x label heights+ if (h == null) {+ labels = [];+ for (i = 0; i < ticks.length; ++i) {+ l = ticks[i].label;+ if (l)+ labels.push('<div class="tickLabel" style="float:left;width:' + w + 'px">' + l + '</div>');+ }++ if (labels.length > 0) {+ // stick them all in the same div and measure+ // collective height+ labels.push('<div style="clear:left"></div>');+ dummyDiv = makeDummyDiv(labels, "width:10000px;");+ h = dummyDiv.height();+ dummyDiv.remove();+ }+ }+ }+ else if (w == null || h == null) {+ // calculate y label dimensions+ for (i = 0; i < ticks.length; ++i) {+ l = ticks[i].label;+ if (l)+ labels.push('<div class="tickLabel">' + l + '</div>');+ }+ + if (labels.length > 0) {+ dummyDiv = makeDummyDiv(labels, "");+ if (w == null)+ w = dummyDiv.children().width();+ if (h == null)+ h = dummyDiv.find("div.tickLabel").height();+ dummyDiv.remove();+ }+ }++ if (w == null)+ w = 0;+ if (h == null)+ h = 0;++ axis.labelWidth = w;+ axis.labelHeight = h;+ }++ function allocateAxisBoxFirstPhase(axis) {+ // find the bounding box of the axis by looking at label+ // widths/heights and ticks, make room by diminishing the+ // plotOffset++ var lw = axis.labelWidth,+ lh = axis.labelHeight,+ pos = axis.options.position,+ tickLength = axis.options.tickLength,+ axismargin = options.grid.axisMargin,+ padding = options.grid.labelMargin,+ all = axis.direction == "x" ? xaxes : yaxes,+ index;++ // determine axis margin+ var samePosition = $.grep(all, function (a) {+ return a && a.options.position == pos && a.reserveSpace;+ });+ if ($.inArray(axis, samePosition) == samePosition.length - 1)+ axismargin = 0; // outermost++ // determine tick length - if we're innermost, we can use "full"+ if (tickLength == null)+ tickLength = "full";++ var sameDirection = $.grep(all, function (a) {+ return a && a.reserveSpace;+ });++ var innermost = $.inArray(axis, sameDirection) == 0;+ if (!innermost && tickLength == "full")+ tickLength = 5;+ + if (!isNaN(+tickLength))+ padding += +tickLength;++ // compute box+ if (axis.direction == "x") {+ lh += padding;+ + if (pos == "bottom") {+ plotOffset.bottom += lh + axismargin;+ axis.box = { top: canvasHeight - plotOffset.bottom, height: lh };+ }+ else {+ axis.box = { top: plotOffset.top + axismargin, height: lh };+ plotOffset.top += lh + axismargin;+ }+ }+ else {+ lw += padding;+ + if (pos == "left") {+ axis.box = { left: plotOffset.left + axismargin, width: lw };+ plotOffset.left += lw + axismargin;+ }+ else {+ plotOffset.right += lw + axismargin;+ axis.box = { left: canvasWidth - plotOffset.right, width: lw };+ }+ }++ // save for future reference+ axis.position = pos;+ axis.tickLength = tickLength;+ axis.box.padding = padding;+ axis.innermost = innermost;+ }++ function allocateAxisBoxSecondPhase(axis) {+ // set remaining bounding box coordinates+ if (axis.direction == "x") {+ axis.box.left = plotOffset.left;+ axis.box.width = plotWidth;+ }+ else {+ axis.box.top = plotOffset.top;+ axis.box.height = plotHeight;+ }+ }+ + function setupGrid() {+ var i, axes = allAxes();++ // first calculate the plot and axis box dimensions++ $.each(axes, function (_, axis) {+ axis.show = axis.options.show;+ if (axis.show == null)+ axis.show = axis.used; // by default an axis is visible if it's got data+ + axis.reserveSpace = axis.show || axis.options.reserveSpace;++ setRange(axis);+ });++ allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; });++ plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0;+ if (options.grid.show) {+ $.each(allocatedAxes, function (_, axis) {+ // make the ticks+ setupTickGeneration(axis);+ setTicks(axis);+ snapRangeToTicks(axis, axis.ticks);++ // find labelWidth/Height for axis+ measureTickLabels(axis);+ });++ // with all dimensions in house, we can compute the+ // axis boxes, start from the outside (reverse order)+ for (i = allocatedAxes.length - 1; i >= 0; --i)+ allocateAxisBoxFirstPhase(allocatedAxes[i]);++ // make sure we've got enough space for things that+ // might stick out+ var minMargin = options.grid.minBorderMargin;+ if (minMargin == null) {+ minMargin = 0;+ for (i = 0; i < series.length; ++i)+ minMargin = Math.max(minMargin, series[i].points.radius + series[i].points.lineWidth/2);+ }+ + for (var a in plotOffset) {+ plotOffset[a] += options.grid.borderWidth;+ plotOffset[a] = Math.max(minMargin, plotOffset[a]);+ }+ }+ + plotWidth = canvasWidth - plotOffset.left - plotOffset.right;+ plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top;++ // now we got the proper plotWidth/Height, we can compute the scaling+ $.each(axes, function (_, axis) {+ setTransformationHelpers(axis);+ });++ if (options.grid.show) {+ $.each(allocatedAxes, function (_, axis) {+ allocateAxisBoxSecondPhase(axis);+ });++ insertAxisLabels();+ }+ + insertLegend();+ }+ + function setRange(axis) {+ var opts = axis.options,+ min = +(opts.min != null ? opts.min : axis.datamin),+ max = +(opts.max != null ? opts.max : axis.datamax),+ delta = max - min;++ if (delta == 0.0) {+ // degenerate case+ var widen = max == 0 ? 1 : 0.01;++ if (opts.min == null)+ min -= widen;+ // always widen max if we couldn't widen min to ensure we+ // don't fall into min == max which doesn't work+ if (opts.max == null || opts.min != null)+ max += widen;+ }+ else {+ // consider autoscaling+ var margin = opts.autoscaleMargin;+ if (margin != null) {+ if (opts.min == null) {+ min -= delta * margin;+ // make sure we don't go below zero if all values+ // are positive+ if (min < 0 && axis.datamin != null && axis.datamin >= 0)+ min = 0;+ }+ if (opts.max == null) {+ max += delta * margin;+ if (max > 0 && axis.datamax != null && axis.datamax <= 0)+ max = 0;+ }+ }+ }+ axis.min = min;+ axis.max = max;+ }++ function setupTickGeneration(axis) {+ var opts = axis.options;+ + // estimate number of ticks+ var noTicks;+ if (typeof opts.ticks == "number" && opts.ticks > 0)+ noTicks = opts.ticks;+ else+ // heuristic based on the model a*sqrt(x) fitted to+ // some data points that seemed reasonable+ noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? canvasWidth : canvasHeight);++ var delta = (axis.max - axis.min) / noTicks,+ size, generator, unit, formatter, i, magn, norm;++ if (opts.mode == "time") {+ // pretty handling of time+ + // map of app. size of time units in milliseconds+ var timeUnitSize = {+ "second": 1000,+ "minute": 60 * 1000,+ "hour": 60 * 60 * 1000,+ "day": 24 * 60 * 60 * 1000,+ "month": 30 * 24 * 60 * 60 * 1000,+ "year": 365.2425 * 24 * 60 * 60 * 1000+ };+++ // the allowed tick sizes, after 1 year we use+ // an integer algorithm+ var spec = [+ [1, "second"], [2, "second"], [5, "second"], [10, "second"],+ [30, "second"], + [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"],+ [30, "minute"], + [1, "hour"], [2, "hour"], [4, "hour"],+ [8, "hour"], [12, "hour"],+ [1, "day"], [2, "day"], [3, "day"],+ [0.25, "month"], [0.5, "month"], [1, "month"],+ [2, "month"], [3, "month"], [6, "month"],+ [1, "year"]+ ];++ var minSize = 0;+ if (opts.minTickSize != null) {+ if (typeof opts.tickSize == "number")+ minSize = opts.tickSize;+ else+ minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];+ }++ for (var i = 0; i < spec.length - 1; ++i)+ if (delta < (spec[i][0] * timeUnitSize[spec[i][1]]+ + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2+ && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize)+ break;+ size = spec[i][0];+ unit = spec[i][1];+ + // special-case the possibility of several years+ if (unit == "year") {+ magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10));+ norm = (delta / timeUnitSize.year) / magn;+ if (norm < 1.5)+ size = 1;+ else if (norm < 3)+ size = 2;+ else if (norm < 7.5)+ size = 5;+ else+ size = 10;++ size *= magn;+ }++ axis.tickSize = opts.tickSize || [size, unit];+ + generator = function(axis) {+ var ticks = [],+ tickSize = axis.tickSize[0], unit = axis.tickSize[1],+ d = new Date(axis.min);+ + var step = tickSize * timeUnitSize[unit];++ if (unit == "second")+ d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize));+ if (unit == "minute")+ d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize));+ if (unit == "hour")+ d.setUTCHours(floorInBase(d.getUTCHours(), tickSize));+ if (unit == "month")+ d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize));+ if (unit == "year")+ d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize));+ + // reset smaller components+ d.setUTCMilliseconds(0);+ if (step >= timeUnitSize.minute)+ d.setUTCSeconds(0);+ if (step >= timeUnitSize.hour)+ d.setUTCMinutes(0);+ if (step >= timeUnitSize.day)+ d.setUTCHours(0);+ if (step >= timeUnitSize.day * 4)+ d.setUTCDate(1);+ if (step >= timeUnitSize.year)+ d.setUTCMonth(0);+++ var carry = 0, v = Number.NaN, prev;+ do {+ prev = v;+ v = d.getTime();+ ticks.push(v);+ if (unit == "month") {+ if (tickSize < 1) {+ // a bit complicated - we'll divide the month+ // up but we need to take care of fractions+ // so we don't end up in the middle of a day+ d.setUTCDate(1);+ var start = d.getTime();+ d.setUTCMonth(d.getUTCMonth() + 1);+ var end = d.getTime();+ d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);+ carry = d.getUTCHours();+ d.setUTCHours(0);+ }+ else+ d.setUTCMonth(d.getUTCMonth() + tickSize);+ }+ else if (unit == "year") {+ d.setUTCFullYear(d.getUTCFullYear() + tickSize);+ }+ else+ d.setTime(v + step);+ } while (v < axis.max && v != prev);++ return ticks;+ };++ formatter = function (v, axis) {+ var d = new Date(v);++ // first check global format+ if (opts.timeformat != null)+ return $.plot.formatDate(d, opts.timeformat, opts.monthNames);+ + var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];+ var span = axis.max - axis.min;+ var suffix = (opts.twelveHourClock) ? " %p" : "";+ + if (t < timeUnitSize.minute)+ fmt = "%h:%M:%S" + suffix;+ else if (t < timeUnitSize.day) {+ if (span < 2 * timeUnitSize.day)+ fmt = "%h:%M" + suffix;+ else+ fmt = "%b %d %h:%M" + suffix;+ }+ else if (t < timeUnitSize.month)+ fmt = "%b %d";+ else if (t < timeUnitSize.year) {+ if (span < timeUnitSize.year)+ fmt = "%b";+ else+ fmt = "%b %y";+ }+ else+ fmt = "%y";+ + return $.plot.formatDate(d, fmt, opts.monthNames);+ };+ }+ else {+ // pretty rounding of base-10 numbers+ var maxDec = opts.tickDecimals;+ var dec = -Math.floor(Math.log(delta) / Math.LN10);+ if (maxDec != null && dec > maxDec)+ dec = maxDec;++ magn = Math.pow(10, -dec);+ norm = delta / magn; // norm is between 1.0 and 10.0+ + if (norm < 1.5)+ size = 1;+ else if (norm < 3) {+ size = 2;+ // special case for 2.5, requires an extra decimal+ if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {+ size = 2.5;+ ++dec;+ }+ }+ else if (norm < 7.5)+ size = 5;+ else+ size = 10;++ size *= magn;+ + if (opts.minTickSize != null && size < opts.minTickSize)+ size = opts.minTickSize;++ axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);+ axis.tickSize = opts.tickSize || size;++ generator = function (axis) {+ var ticks = [];++ // spew out all possible ticks+ var start = floorInBase(axis.min, axis.tickSize),+ i = 0, v = Number.NaN, prev;+ do {+ prev = v;+ v = start + i * axis.tickSize;+ ticks.push(v);+ ++i;+ } while (v < axis.max && v != prev);+ return ticks;+ };++ formatter = function (v, axis) {+ return v.toFixed(axis.tickDecimals);+ };+ }++ if (opts.alignTicksWithAxis != null) {+ var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];+ if (otherAxis && otherAxis.used && otherAxis != axis) {+ // consider snapping min/max to outermost nice ticks+ var niceTicks = generator(axis);+ if (niceTicks.length > 0) {+ if (opts.min == null)+ axis.min = Math.min(axis.min, niceTicks[0]);+ if (opts.max == null && niceTicks.length > 1)+ axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);+ }+ + generator = function (axis) {+ // copy ticks, scaled to this axis+ var ticks = [], v, i;+ for (i = 0; i < otherAxis.ticks.length; ++i) {+ v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);+ v = axis.min + v * (axis.max - axis.min);+ ticks.push(v);+ }+ return ticks;+ };+ + // we might need an extra decimal since forced+ // ticks don't necessarily fit naturally+ if (axis.mode != "time" && opts.tickDecimals == null) {+ var extraDec = Math.max(0, -Math.floor(Math.log(delta) / Math.LN10) + 1),+ ts = generator(axis);++ // only proceed if the tick interval rounded+ // with an extra decimal doesn't give us a+ // zero at end+ if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))+ axis.tickDecimals = extraDec;+ }+ }+ }++ axis.tickGenerator = generator;+ if ($.isFunction(opts.tickFormatter))+ axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); };+ else+ axis.tickFormatter = formatter;+ }+ + function setTicks(axis) {+ var oticks = axis.options.ticks, ticks = [];+ if (oticks == null || (typeof oticks == "number" && oticks > 0))+ ticks = axis.tickGenerator(axis);+ else if (oticks) {+ if ($.isFunction(oticks))+ // generate the ticks+ ticks = oticks({ min: axis.min, max: axis.max });+ else+ ticks = oticks;+ }++ // clean up/labelify the supplied ticks, copy them over+ var i, v;+ axis.ticks = [];+ for (i = 0; i < ticks.length; ++i) {+ var label = null;+ var t = ticks[i];+ if (typeof t == "object") {+ v = +t[0];+ if (t.length > 1)+ label = t[1];+ }+ else+ v = +t;+ if (label == null)+ label = axis.tickFormatter(v, axis);+ if (!isNaN(v))+ axis.ticks.push({ v: v, label: label });+ }+ }++ function snapRangeToTicks(axis, ticks) {+ if (axis.options.autoscaleMargin && ticks.length > 0) {+ // snap to ticks+ if (axis.options.min == null)+ axis.min = Math.min(axis.min, ticks[0].v);+ if (axis.options.max == null && ticks.length > 1)+ axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);+ }+ }+ + function draw() {+ ctx.clearRect(0, 0, canvasWidth, canvasHeight);++ var grid = options.grid;++ // draw background, if any+ if (grid.show && grid.backgroundColor)+ drawBackground();+ + if (grid.show && !grid.aboveData)+ drawGrid();++ for (var i = 0; i < series.length; ++i) {+ executeHooks(hooks.drawSeries, [ctx, series[i]]);+ drawSeries(series[i]);+ }++ executeHooks(hooks.draw, [ctx]);+ + if (grid.show && grid.aboveData)+ drawGrid();+ }++ function extractRange(ranges, coord) {+ var axis, from, to, key, axes = allAxes();++ for (i = 0; i < axes.length; ++i) {+ axis = axes[i];+ if (axis.direction == coord) {+ key = coord + axis.n + "axis";+ if (!ranges[key] && axis.n == 1)+ key = coord + "axis"; // support x1axis as xaxis+ if (ranges[key]) {+ from = ranges[key].from;+ to = ranges[key].to;+ break;+ }+ }+ }++ // backwards-compat stuff - to be removed in future+ if (!ranges[key]) {+ axis = coord == "x" ? xaxes[0] : yaxes[0];+ from = ranges[coord + "1"];+ to = ranges[coord + "2"];+ }++ // auto-reverse as an added bonus+ if (from != null && to != null && from > to) {+ var tmp = from;+ from = to;+ to = tmp;+ }+ + return { from: from, to: to, axis: axis };+ }+ + function drawBackground() {+ ctx.save();+ ctx.translate(plotOffset.left, plotOffset.top);++ ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)");+ ctx.fillRect(0, 0, plotWidth, plotHeight);+ ctx.restore();+ }++ function drawGrid() {+ var i;+ + ctx.save();+ ctx.translate(plotOffset.left, plotOffset.top);++ // draw markings+ var markings = options.grid.markings;+ if (markings) {+ if ($.isFunction(markings)) {+ var axes = plot.getAxes();+ // xmin etc. is backwards compatibility, to be+ // removed in the future+ axes.xmin = axes.xaxis.min;+ axes.xmax = axes.xaxis.max;+ axes.ymin = axes.yaxis.min;+ axes.ymax = axes.yaxis.max;+ + markings = markings(axes);+ }++ for (i = 0; i < markings.length; ++i) {+ var m = markings[i],+ xrange = extractRange(m, "x"),+ yrange = extractRange(m, "y");++ // fill in missing+ if (xrange.from == null)+ xrange.from = xrange.axis.min;+ if (xrange.to == null)+ xrange.to = xrange.axis.max;+ if (yrange.from == null)+ yrange.from = yrange.axis.min;+ if (yrange.to == null)+ yrange.to = yrange.axis.max;++ // clip+ if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||+ yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)+ continue;++ xrange.from = Math.max(xrange.from, xrange.axis.min);+ xrange.to = Math.min(xrange.to, xrange.axis.max);+ yrange.from = Math.max(yrange.from, yrange.axis.min);+ yrange.to = Math.min(yrange.to, yrange.axis.max);++ if (xrange.from == xrange.to && yrange.from == yrange.to)+ continue;++ // then draw+ xrange.from = xrange.axis.p2c(xrange.from);+ xrange.to = xrange.axis.p2c(xrange.to);+ yrange.from = yrange.axis.p2c(yrange.from);+ yrange.to = yrange.axis.p2c(yrange.to);+ + if (xrange.from == xrange.to || yrange.from == yrange.to) {+ // draw line+ ctx.beginPath();+ ctx.strokeStyle = m.color || options.grid.markingsColor;+ ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth;+ ctx.moveTo(xrange.from, yrange.from);+ ctx.lineTo(xrange.to, yrange.to);+ ctx.stroke();+ }+ else {+ // fill area+ ctx.fillStyle = m.color || options.grid.markingsColor;+ ctx.fillRect(xrange.from, yrange.to,+ xrange.to - xrange.from,+ yrange.from - yrange.to);+ }+ }+ }+ + // draw the ticks+ var axes = allAxes(), bw = options.grid.borderWidth;++ for (var j = 0; j < axes.length; ++j) {+ var axis = axes[j], box = axis.box,+ t = axis.tickLength, x, y, xoff, yoff;+ if (!axis.show || axis.ticks.length == 0)+ continue+ + ctx.strokeStyle = axis.options.tickColor || $.color.parse(axis.options.color).scale('a', 0.22).toString();+ ctx.lineWidth = 1;++ // find the edges+ if (axis.direction == "x") {+ x = 0;+ if (t == "full")+ y = (axis.position == "top" ? 0 : plotHeight);+ else+ y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0);+ }+ else {+ y = 0;+ if (t == "full")+ x = (axis.position == "left" ? 0 : plotWidth);+ else+ x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0);+ }+ + // draw tick bar+ if (!axis.innermost) {+ ctx.beginPath();+ xoff = yoff = 0;+ if (axis.direction == "x")+ xoff = plotWidth;+ else+ yoff = plotHeight;+ + if (ctx.lineWidth == 1) {+ x = Math.floor(x) + 0.5;+ y = Math.floor(y) + 0.5;+ }++ ctx.moveTo(x, y);+ ctx.lineTo(x + xoff, y + yoff);+ ctx.stroke();+ }++ // draw ticks+ ctx.beginPath();+ for (i = 0; i < axis.ticks.length; ++i) {+ var v = axis.ticks[i].v;+ + xoff = yoff = 0;++ if (v < axis.min || v > axis.max+ // skip those lying on the axes if we got a border+ || (t == "full" && bw > 0+ && (v == axis.min || v == axis.max)))+ continue;++ if (axis.direction == "x") {+ x = axis.p2c(v);+ yoff = t == "full" ? -plotHeight : t;+ + if (axis.position == "top")+ yoff = -yoff;+ }+ else {+ y = axis.p2c(v);+ xoff = t == "full" ? -plotWidth : t;+ + if (axis.position == "left")+ xoff = -xoff;+ }++ if (ctx.lineWidth == 1) {+ if (axis.direction == "x")+ x = Math.floor(x) + 0.5;+ else+ y = Math.floor(y) + 0.5;+ }++ ctx.moveTo(x, y);+ ctx.lineTo(x + xoff, y + yoff);+ }+ + ctx.stroke();+ }+ + + // draw border+ if (bw) {+ ctx.lineWidth = bw;+ ctx.strokeStyle = options.grid.borderColor;+ ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);+ }++ ctx.restore();+ }++ function insertAxisLabels() {+ placeholder.find(".tickLabels").remove();+ + var html = ['<div class="tickLabels" style="font-size:smaller">'];++ var axes = allAxes();+ for (var j = 0; j < axes.length; ++j) {+ var axis = axes[j], box = axis.box;+ if (!axis.show)+ continue;+ //debug: html.push('<div style="position:absolute;opacity:0.10;background-color:red;left:' + box.left + 'px;top:' + box.top + 'px;width:' + box.width + 'px;height:' + box.height + 'px"></div>')+ html.push('<div class="' + axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis" style="color:' + axis.options.color + '">');+ for (var i = 0; i < axis.ticks.length; ++i) {+ var tick = axis.ticks[i];+ if (!tick.label || tick.v < axis.min || tick.v > axis.max)+ continue;++ var pos = {}, align;+ + if (axis.direction == "x") {+ align = "center";+ pos.left = Math.round(plotOffset.left + axis.p2c(tick.v) - axis.labelWidth/2);+ if (axis.position == "bottom")+ pos.top = box.top + box.padding;+ else+ pos.bottom = canvasHeight - (box.top + box.height - box.padding);+ }+ else {+ pos.top = Math.round(plotOffset.top + axis.p2c(tick.v) - axis.labelHeight/2);+ if (axis.position == "left") {+ pos.right = canvasWidth - (box.left + box.width - box.padding)+ align = "right";+ }+ else {+ pos.left = box.left + box.padding;+ align = "left";+ }+ }++ pos.width = axis.labelWidth;++ var style = ["position:absolute", "text-align:" + align ];+ for (var a in pos)+ style.push(a + ":" + pos[a] + "px")+ + html.push('<div class="tickLabel" style="' + style.join(';') + '">' + tick.label + '</div>');+ }+ html.push('</div>');+ }++ html.push('</div>');++ placeholder.append(html.join(""));+ }++ function drawSeries(series) {+ if (series.lines.show)+ drawSeriesLines(series);+ if (series.bars.show)+ drawSeriesBars(series);+ if (series.points.show)+ drawSeriesPoints(series);+ }+ + function drawSeriesLines(series) {+ function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {+ var points = datapoints.points,+ ps = datapoints.pointsize,+ prevx = null, prevy = null;+ + ctx.beginPath();+ for (var i = ps; i < points.length; i += ps) {+ var x1 = points[i - ps], y1 = points[i - ps + 1],+ x2 = points[i], y2 = points[i + 1];+ + if (x1 == null || x2 == null)+ continue;++ // clip with ymin+ if (y1 <= y2 && y1 < axisy.min) {+ if (y2 < axisy.min)+ continue; // line segment is outside+ // compute new intersection point+ x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;+ y1 = axisy.min;+ }+ else if (y2 <= y1 && y2 < axisy.min) {+ if (y1 < axisy.min)+ continue;+ x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;+ y2 = axisy.min;+ }++ // clip with ymax+ if (y1 >= y2 && y1 > axisy.max) {+ if (y2 > axisy.max)+ continue;+ x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;+ y1 = axisy.max;+ }+ else if (y2 >= y1 && y2 > axisy.max) {+ if (y1 > axisy.max)+ continue;+ x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;+ y2 = axisy.max;+ }++ // clip with xmin+ if (x1 <= x2 && x1 < axisx.min) {+ if (x2 < axisx.min)+ continue;+ y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;+ x1 = axisx.min;+ }+ else if (x2 <= x1 && x2 < axisx.min) {+ if (x1 < axisx.min)+ continue;+ y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;+ x2 = axisx.min;+ }++ // clip with xmax+ if (x1 >= x2 && x1 > axisx.max) {+ if (x2 > axisx.max)+ continue;+ y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;+ x1 = axisx.max;+ }+ else if (x2 >= x1 && x2 > axisx.max) {+ if (x1 > axisx.max)+ continue;+ y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;+ x2 = axisx.max;+ }++ if (x1 != prevx || y1 != prevy)+ ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);+ + prevx = x2;+ prevy = y2;+ ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);+ }+ ctx.stroke();+ }++ function plotLineArea(datapoints, axisx, axisy) {+ var points = datapoints.points,+ ps = datapoints.pointsize,+ bottom = Math.min(Math.max(0, axisy.min), axisy.max),+ i = 0, top, areaOpen = false,+ ypos = 1, segmentStart = 0, segmentEnd = 0;++ // we process each segment in two turns, first forward+ // direction to sketch out top, then once we hit the+ // end we go backwards to sketch the bottom+ while (true) {+ if (ps > 0 && i > points.length + ps)+ break;++ i += ps; // ps is negative if going backwards++ var x1 = points[i - ps],+ y1 = points[i - ps + ypos],+ x2 = points[i], y2 = points[i + ypos];++ if (areaOpen) {+ if (ps > 0 && x1 != null && x2 == null) {+ // at turning point+ segmentEnd = i;+ ps = -ps;+ ypos = 2;+ continue;+ }++ if (ps < 0 && i == segmentStart + ps) {+ // done with the reverse sweep+ ctx.fill();+ areaOpen = false;+ ps = -ps;+ ypos = 1;+ i = segmentStart = segmentEnd + ps;+ continue;+ }+ }++ if (x1 == null || x2 == null)+ continue;++ // clip x values+ + // clip with xmin+ if (x1 <= x2 && x1 < axisx.min) {+ if (x2 < axisx.min)+ continue;+ y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;+ x1 = axisx.min;+ }+ else if (x2 <= x1 && x2 < axisx.min) {+ if (x1 < axisx.min)+ continue;+ y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;+ x2 = axisx.min;+ }++ // clip with xmax+ if (x1 >= x2 && x1 > axisx.max) {+ if (x2 > axisx.max)+ continue;+ y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;+ x1 = axisx.max;+ }+ else if (x2 >= x1 && x2 > axisx.max) {+ if (x1 > axisx.max)+ continue;+ y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;+ x2 = axisx.max;+ }++ if (!areaOpen) {+ // open area+ ctx.beginPath();+ ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));+ areaOpen = true;+ }+ + // now first check the case where both is outside+ if (y1 >= axisy.max && y2 >= axisy.max) {+ ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));+ ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));+ continue;+ }+ else if (y1 <= axisy.min && y2 <= axisy.min) {+ ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));+ ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));+ continue;+ }+ + // else it's a bit more complicated, there might+ // be a flat maxed out rectangle first, then a+ // triangular cutout or reverse; to find these+ // keep track of the current x values+ var x1old = x1, x2old = x2;++ // clip the y values, without shortcutting, we+ // go through all cases in turn+ + // clip with ymin+ if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {+ x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;+ y1 = axisy.min;+ }+ else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {+ x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;+ y2 = axisy.min;+ }++ // clip with ymax+ if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {+ x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;+ y1 = axisy.max;+ }+ else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {+ x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;+ y2 = axisy.max;+ }++ // if the x value was changed we got a rectangle+ // to fill+ if (x1 != x1old) {+ ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));+ // it goes to (x1, y1), but we fill that below+ }+ + // fill triangular section, this sometimes result+ // in redundant points if (x1, y1) hasn't changed+ // from previous line to, but we just ignore that+ ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));+ ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));++ // fill the other rectangle if it's there+ if (x2 != x2old) {+ ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));+ ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));+ }+ }+ }++ ctx.save();+ ctx.translate(plotOffset.left, plotOffset.top);+ ctx.lineJoin = "round";++ var lw = series.lines.lineWidth,+ sw = series.shadowSize;+ // FIXME: consider another form of shadow when filling is turned on+ if (lw > 0 && sw > 0) {+ // draw shadow as a thick and thin line with transparency+ ctx.lineWidth = sw;+ ctx.strokeStyle = "rgba(0,0,0,0.1)";+ // position shadow at angle from the mid of line+ var angle = Math.PI/18;+ plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);+ ctx.lineWidth = sw/2;+ plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);+ }++ ctx.lineWidth = lw;+ ctx.strokeStyle = series.color;+ var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);+ if (fillStyle) {+ ctx.fillStyle = fillStyle;+ plotLineArea(series.datapoints, series.xaxis, series.yaxis);+ }++ if (lw > 0)+ plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);+ ctx.restore();+ }++ function drawSeriesPoints(series) {+ function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {+ var points = datapoints.points, ps = datapoints.pointsize;++ for (var i = 0; i < points.length; i += ps) {+ var x = points[i], y = points[i + 1];+ if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)+ continue;+ + ctx.beginPath();+ x = axisx.p2c(x);+ y = axisy.p2c(y) + offset;+ if (symbol == "circle")+ ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);+ else+ symbol(ctx, x, y, radius, shadow);+ ctx.closePath();+ + if (fillStyle) {+ ctx.fillStyle = fillStyle;+ ctx.fill();+ }+ ctx.stroke();+ }+ }+ + ctx.save();+ ctx.translate(plotOffset.left, plotOffset.top);++ var lw = series.points.lineWidth,+ sw = series.shadowSize,+ radius = series.points.radius,+ symbol = series.points.symbol;+ if (lw > 0 && sw > 0) {+ // draw shadow in two steps+ var w = sw / 2;+ ctx.lineWidth = w;+ ctx.strokeStyle = "rgba(0,0,0,0.1)";+ plotPoints(series.datapoints, radius, null, w + w/2, true,+ series.xaxis, series.yaxis, symbol);++ ctx.strokeStyle = "rgba(0,0,0,0.2)";+ plotPoints(series.datapoints, radius, null, w/2, true,+ series.xaxis, series.yaxis, symbol);+ }++ ctx.lineWidth = lw;+ ctx.strokeStyle = series.color;+ plotPoints(series.datapoints, radius,+ getFillStyle(series.points, series.color), 0, false,+ series.xaxis, series.yaxis, symbol);+ ctx.restore();+ }++ function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {+ var left, right, bottom, top,+ drawLeft, drawRight, drawTop, drawBottom,+ tmp;++ // in horizontal mode, we start the bar from the left+ // instead of from the bottom so it appears to be+ // horizontal rather than vertical+ if (horizontal) {+ drawBottom = drawRight = drawTop = true;+ drawLeft = false;+ left = b;+ right = x;+ top = y + barLeft;+ bottom = y + barRight;++ // account for negative bars+ if (right < left) {+ tmp = right;+ right = left;+ left = tmp;+ drawLeft = true;+ drawRight = false;+ }+ }+ else {+ drawLeft = drawRight = drawTop = true;+ drawBottom = false;+ left = x + barLeft;+ right = x + barRight;+ bottom = b;+ top = y;++ // account for negative bars+ if (top < bottom) {+ tmp = top;+ top = bottom;+ bottom = tmp;+ drawBottom = true;+ drawTop = false;+ }+ }+ + // clip+ if (right < axisx.min || left > axisx.max ||+ top < axisy.min || bottom > axisy.max)+ return;+ + if (left < axisx.min) {+ left = axisx.min;+ drawLeft = false;+ }++ if (right > axisx.max) {+ right = axisx.max;+ drawRight = false;+ }++ if (bottom < axisy.min) {+ bottom = axisy.min;+ drawBottom = false;+ }+ + if (top > axisy.max) {+ top = axisy.max;+ drawTop = false;+ }++ left = axisx.p2c(left);+ bottom = axisy.p2c(bottom);+ right = axisx.p2c(right);+ top = axisy.p2c(top);+ + // fill the bar+ if (fillStyleCallback) {+ c.beginPath();+ c.moveTo(left, bottom);+ c.lineTo(left, top);+ c.lineTo(right, top);+ c.lineTo(right, bottom);+ c.fillStyle = fillStyleCallback(bottom, top);+ c.fill();+ }++ // draw outline+ if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {+ c.beginPath();++ // FIXME: inline moveTo is buggy with excanvas+ c.moveTo(left, bottom + offset);+ if (drawLeft)+ c.lineTo(left, top + offset);+ else+ c.moveTo(left, top + offset);+ if (drawTop)+ c.lineTo(right, top + offset);+ else+ c.moveTo(right, top + offset);+ if (drawRight)+ c.lineTo(right, bottom + offset);+ else+ c.moveTo(right, bottom + offset);+ if (drawBottom)+ c.lineTo(left, bottom + offset);+ else+ c.moveTo(left, bottom + offset);+ c.stroke();+ }+ }+ + function drawSeriesBars(series) {+ function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) {+ var points = datapoints.points, ps = datapoints.pointsize;+ + for (var i = 0; i < points.length; i += ps) {+ if (points[i] == null)+ continue;+ drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);+ }+ }++ ctx.save();+ ctx.translate(plotOffset.left, plotOffset.top);++ // FIXME: figure out a way to add shadows (for instance along the right edge)+ ctx.lineWidth = series.bars.lineWidth;+ ctx.strokeStyle = series.color;+ var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2;+ var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;+ plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis);+ ctx.restore();+ }++ function getFillStyle(filloptions, seriesColor, bottom, top) {+ var fill = filloptions.fill;+ if (!fill)+ return null;++ if (filloptions.fillColor)+ return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);+ + var c = $.color.parse(seriesColor);+ c.a = typeof fill == "number" ? fill : 0.4;+ c.normalize();+ return c.toString();+ }+ + function insertLegend() {+ placeholder.find(".legend").remove();++ if (!options.legend.show)+ return;+ + var fragments = [], rowStarted = false,+ lf = options.legend.labelFormatter, s, label;+ for (var i = 0; i < series.length; ++i) {+ s = series[i];+ label = s.label;+ if (!label)+ continue;+ + if (i % options.legend.noColumns == 0) {+ if (rowStarted)+ fragments.push('</tr>');+ fragments.push('<tr>');+ rowStarted = true;+ }++ if (lf)+ label = lf(label, s);+ + fragments.push(+ '<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + s.color + ';overflow:hidden"></div></div></td>' ++ '<td class="legendLabel">' + label + '</td>');+ }+ if (rowStarted)+ fragments.push('</tr>');+ + if (fragments.length == 0)+ return;++ var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>';+ if (options.legend.container != null)+ $(options.legend.container).html(table);+ else {+ var pos = "",+ p = options.legend.position,+ m = options.legend.margin;+ if (m[0] == null)+ m = [m, m];+ if (p.charAt(0) == "n")+ pos += 'top:' + (m[1] + plotOffset.top) + 'px;';+ else if (p.charAt(0) == "s")+ pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';+ if (p.charAt(1) == "e")+ pos += 'right:' + (m[0] + plotOffset.right) + 'px;';+ else if (p.charAt(1) == "w")+ pos += 'left:' + (m[0] + plotOffset.left) + 'px;';+ var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder);+ if (options.legend.backgroundOpacity != 0.0) {+ // put in the transparent background+ // separately to avoid blended labels and+ // label boxes+ var c = options.legend.backgroundColor;+ if (c == null) {+ c = options.grid.backgroundColor;+ if (c && typeof c == "string")+ c = $.color.parse(c);+ else+ c = $.color.extract(legend, 'background-color');+ c.a = 1;+ c = c.toString();+ }+ var div = legend.children();+ $('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);+ }+ }+ }+++ // interactive features+ + var highlights = [],+ redrawTimeout = null;+ + // returns the data item the mouse is over, or null if none is found+ function findNearbyItem(mouseX, mouseY, seriesFilter) {+ var maxDistance = options.grid.mouseActiveRadius,+ smallestDistance = maxDistance * maxDistance + 1,+ item = null, foundPoint = false, i, j;++ for (i = series.length - 1; i >= 0; --i) {+ if (!seriesFilter(series[i]))+ continue;+ + var s = series[i],+ axisx = s.xaxis,+ axisy = s.yaxis,+ points = s.datapoints.points,+ ps = s.datapoints.pointsize,+ mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster+ my = axisy.c2p(mouseY),+ maxx = maxDistance / axisx.scale,+ maxy = maxDistance / axisy.scale;++ // with inverse transforms, we can't use the maxx/maxy+ // optimization, sadly+ if (axisx.options.inverseTransform)+ maxx = Number.MAX_VALUE;+ if (axisy.options.inverseTransform)+ maxy = Number.MAX_VALUE;+ + if (s.lines.show || s.points.show) {+ for (j = 0; j < points.length; j += ps) {+ var x = points[j], y = points[j + 1];+ if (x == null)+ continue;+ + // For points and lines, the cursor must be within a+ // certain distance to the data point+ if (x - mx > maxx || x - mx < -maxx ||+ y - my > maxy || y - my < -maxy)+ continue;++ // We have to calculate distances in pixels, not in+ // data units, because the scales of the axes may be different+ var dx = Math.abs(axisx.p2c(x) - mouseX),+ dy = Math.abs(axisy.p2c(y) - mouseY),+ dist = dx * dx + dy * dy; // we save the sqrt++ // use <= to ensure last point takes precedence+ // (last generally means on top of)+ if (dist < smallestDistance) {+ smallestDistance = dist;+ item = [i, j / ps];+ }+ }+ }+ + if (s.bars.show && !item) { // no other point can be nearby+ var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2,+ barRight = barLeft + s.bars.barWidth;+ + for (j = 0; j < points.length; j += ps) {+ var x = points[j], y = points[j + 1], b = points[j + 2];+ if (x == null)+ continue;+ + // for a bar graph, the cursor must be inside the bar+ if (series[i].bars.horizontal ? + (mx <= Math.max(b, x) && mx >= Math.min(b, x) && + my >= y + barLeft && my <= y + barRight) :+ (mx >= x + barLeft && mx <= x + barRight &&+ my >= Math.min(b, y) && my <= Math.max(b, y)))+ item = [i, j / ps];+ }+ }+ }++ if (item) {+ i = item[0];+ j = item[1];+ ps = series[i].datapoints.pointsize;+ + return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),+ dataIndex: j,+ series: series[i],+ seriesIndex: i };+ }+ + return null;+ }++ function onMouseMove(e) {+ if (options.grid.hoverable)+ triggerClickHoverEvent("plothover", e,+ function (s) { return s["hoverable"] != false; });+ }++ function onMouseLeave(e) {+ if (options.grid.hoverable)+ triggerClickHoverEvent("plothover", e,+ function (s) { return false; });+ }++ function onClick(e) {+ triggerClickHoverEvent("plotclick", e,+ function (s) { return s["clickable"] != false; });+ }++ // trigger click or hover event (they send the same parameters+ // so we share their code)+ function triggerClickHoverEvent(eventname, event, seriesFilter) {+ var offset = eventHolder.offset(),+ canvasX = event.pageX - offset.left - plotOffset.left,+ canvasY = event.pageY - offset.top - plotOffset.top,+ pos = canvasToAxisCoords({ left: canvasX, top: canvasY });++ pos.pageX = event.pageX;+ pos.pageY = event.pageY;++ var item = findNearbyItem(canvasX, canvasY, seriesFilter);++ if (item) {+ // fill in mouse pos for any listeners out there+ item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left);+ item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top);+ }++ if (options.grid.autoHighlight) {+ // clear auto-highlights+ for (var i = 0; i < highlights.length; ++i) {+ var h = highlights[i];+ if (h.auto == eventname &&+ !(item && h.series == item.series &&+ h.point[0] == item.datapoint[0] &&+ h.point[1] == item.datapoint[1]))+ unhighlight(h.series, h.point);+ }+ + if (item)+ highlight(item.series, item.datapoint, eventname);+ }+ + placeholder.trigger(eventname, [ pos, item ]);+ }++ function triggerRedrawOverlay() {+ if (!redrawTimeout)+ redrawTimeout = setTimeout(drawOverlay, 30);+ }++ function drawOverlay() {+ redrawTimeout = null;++ // draw highlights+ octx.save();+ octx.clearRect(0, 0, canvasWidth, canvasHeight);+ octx.translate(plotOffset.left, plotOffset.top);+ + var i, hi;+ for (i = 0; i < highlights.length; ++i) {+ hi = highlights[i];++ if (hi.series.bars.show)+ drawBarHighlight(hi.series, hi.point);+ else+ drawPointHighlight(hi.series, hi.point);+ }+ octx.restore();+ + executeHooks(hooks.drawOverlay, [octx]);+ }+ + function highlight(s, point, auto) {+ if (typeof s == "number")+ s = series[s];++ if (typeof point == "number") {+ var ps = s.datapoints.pointsize;+ point = s.datapoints.points.slice(ps * point, ps * (point + 1));+ }++ var i = indexOfHighlight(s, point);+ if (i == -1) {+ highlights.push({ series: s, point: point, auto: auto });++ triggerRedrawOverlay();+ }+ else if (!auto)+ highlights[i].auto = false;+ }+ + function unhighlight(s, point) {+ if (s == null && point == null) {+ highlights = [];+ triggerRedrawOverlay();+ }+ + if (typeof s == "number")+ s = series[s];++ if (typeof point == "number")+ point = s.data[point];++ var i = indexOfHighlight(s, point);+ if (i != -1) {+ highlights.splice(i, 1);++ triggerRedrawOverlay();+ }+ }+ + function indexOfHighlight(s, p) {+ for (var i = 0; i < highlights.length; ++i) {+ var h = highlights[i];+ if (h.series == s && h.point[0] == p[0]+ && h.point[1] == p[1])+ return i;+ }+ return -1;+ }+ + function drawPointHighlight(series, point) {+ var x = point[0], y = point[1],+ axisx = series.xaxis, axisy = series.yaxis;+ + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)+ return;+ + var pointRadius = series.points.radius + series.points.lineWidth / 2;+ octx.lineWidth = pointRadius;+ octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString();+ var radius = 1.5 * pointRadius,+ x = axisx.p2c(x),+ y = axisy.p2c(y);+ + octx.beginPath();+ if (series.points.symbol == "circle")+ octx.arc(x, y, radius, 0, 2 * Math.PI, false);+ else+ series.points.symbol(octx, x, y, radius, false);+ octx.closePath();+ octx.stroke();+ }++ function drawBarHighlight(series, point) {+ octx.lineWidth = series.bars.lineWidth;+ octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString();+ var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString();+ var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2;+ drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,+ 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);+ }++ function getColorOrGradient(spec, bottom, top, defaultColor) {+ if (typeof spec == "string")+ return spec;+ else {+ // assume this is a gradient spec; IE currently only+ // supports a simple vertical gradient properly, so that's+ // what we support too+ var gradient = ctx.createLinearGradient(0, top, 0, bottom);+ + for (var i = 0, l = spec.colors.length; i < l; ++i) {+ var c = spec.colors[i];+ if (typeof c != "string") {+ var co = $.color.parse(defaultColor);+ if (c.brightness != null)+ co = co.scale('rgb', c.brightness)+ if (c.opacity != null)+ co.a *= c.opacity;+ c = co.toString();+ }+ gradient.addColorStop(i / (l - 1), c);+ }+ + return gradient;+ }+ }+ }++ $.plot = function(placeholder, data, options) {+ //var t0 = new Date();+ var plot = new Plot($(placeholder), data, options, $.plot.plugins);+ //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime()));+ return plot;+ };++ $.plot.version = "0.7";+ + $.plot.plugins = [];++ // returns a string with the date d formatted according to fmt+ $.plot.formatDate = function(d, fmt, monthNames) {+ var leftPad = function(n) {+ n = "" + n;+ return n.length == 1 ? "0" + n : n;+ };+ + var r = [];+ var escape = false, padNext = false;+ var hours = d.getUTCHours();+ var isAM = hours < 12;+ if (monthNames == null)+ monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];++ if (fmt.search(/%p|%P/) != -1) {+ if (hours > 12) {+ hours = hours - 12;+ } else if (hours == 0) {+ hours = 12;+ }+ }+ for (var i = 0; i < fmt.length; ++i) {+ var c = fmt.charAt(i);+ + if (escape) {+ switch (c) {+ case 'h': c = "" + hours; break;+ case 'H': c = leftPad(hours); break;+ case 'M': c = leftPad(d.getUTCMinutes()); break;+ case 'S': c = leftPad(d.getUTCSeconds()); break;+ case 'd': c = "" + d.getUTCDate(); break;+ case 'm': c = "" + (d.getUTCMonth() + 1); break;+ case 'y': c = "" + d.getUTCFullYear(); break;+ case 'b': c = "" + monthNames[d.getUTCMonth()]; break;+ case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break;+ case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break;+ case '0': c = ""; padNext = true; break;+ }+ if (c && padNext) {+ c = leftPad(c);+ padNext = false;+ }+ r.push(c);+ if (!padNext)+ escape = false;+ }+ else {+ if (c == "%")+ escape = true;+ else+ r.push(c);+ }+ }+ return r.join("");+ };+ + // round to nearby lower multiple of base+ function floorInBase(n, base) {+ return base * Math.floor(n / base);+ }+ +})(jQuery);
+ static/jquery.js view
@@ -0,0 +1,154 @@+/*!+ * jQuery JavaScript Library v1.4.2+ * http://jquery.com/+ *+ * Copyright 2010, John Resig+ * Dual licensed under the MIT or GPL Version 2 licenses.+ * http://jquery.org/license+ *+ * Includes Sizzle.js+ * http://sizzlejs.com/+ * Copyright 2010, The Dojo Foundation+ * Released under the MIT, BSD, and GPL Licenses.+ *+ * Date: Sat Feb 13 22:33:48 2010 -0500+ */+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "++a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
+ static/jquery.url.js view
@@ -0,0 +1,1 @@+jQuery.url=function(){var segments={};var parsed={};var options={url:window.location,strictMode:false,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}};var parseUri=function(){str=decodeURI(options.url);var m=options.parser[options.strictMode?"strict":"loose"].exec(str);var uri={};var i=14;while(i--){uri[options.key[i]]=m[i]||""}uri[options.q.name]={};uri[options.key[12]].replace(options.q.parser,function($0,$1,$2){if($1){uri[options.q.name][$1]=$2}});return uri};var key=function(key){if(!parsed.length){setUp()}if(key=="base"){if(parsed.port!==null&&parsed.port!==""){return parsed.protocol+"://"+parsed.host+":"+parsed.port+"/"}else{return parsed.protocol+"://"+parsed.host+"/"}}return(parsed[key]==="")?null:parsed[key]};var param=function(item){if(!parsed.length){setUp()}return(parsed.queryKey[item]===null)?null:parsed.queryKey[item]};var setUp=function(){parsed=parseUri();getSegments()};var getSegments=function(){var p=parsed.path;segments=[];segments=parsed.path.length==1?{}:(p.charAt(p.length-1)=="/"?p.substring(1,p.length-1):path=p.substring(1)).split("/")};return{setMode:function(mode){strictMode=mode=="strict"?true:false;return this},setUrl:function(newUri){options.url=newUri===undefined?window.location:newUri;setUp();return this},segment:function(pos){if(!parsed.length){setUp()}if(pos===undefined){return segments.length}return(segments[pos]===""||segments[pos]===undefined)?null:segments[pos]},attr:key,param:param}}();
+ static/style.css view
@@ -0,0 +1,284 @@+/* hledger web ui styles */++/*------------------------------------------------------------------------------------------*/+/* 1. colours */++/* green */+body { background-color:white; color:black; }+.registerreport .odd { background-color:#ded; }+.journalreport .odd { background-color:#eee; }+.filtering { background-color:#ded; }+/* #main { border-color:#ded; } see below */+/* .journalreport td { border-color:thin solid #ded; } see below */++/* white */+/* body { background-color:#fff; } */+/* .registerreport .odd { background-color:#eee; } */+/* .filtering { background-color:#ddd; } */+/* #main { border-color:#eee; } see below */+/* .journalreport td { border-color:thin solid #eee; } see below */++#message { color:red; background-color:#fee; }+#addform input.textinput, #addform .dhx_combo_input, .dhx_combo_list { background-color:#eee; }+#editform textarea { background-color:#eee; }+.negative { color:#800; }+.help { }++.balancereport .inacct { /*background-color:#ddd;*/ font-weight:bold; }+.notinacct, .notinacct :link, .notinacct :visited { color:#888; }+.notinacct .negative { color:#b77; }+.balancereport .numpostings { padding-left:1em; color:#aaa; }+.balancereport td.add.mouseover { background-color:rgba(208,208,208,0.5); }+.balancereport td.journal.mouseover { background-color:rgba(208,208,208,0.5); }+.balancereport td.journal.mouseover .hoverlinks { visibility:visible; }+.balancereport td.account.mouseover { background-color:rgba(208,208,208,0.5); }+.balancereport td.account.mouseover .hoverlinks { visibility:visible; }+.balancereport .hoverlinks { visibility:hidden; }+.balancereport .hoverlinks { margin-left:0em; font-weight:normal; /*font-size:smaller;*/ display:inline-block; text-align:right; }+.balancereport .hoverlinks a { margin-left:0.5em; }++/*------------------------------------------------------------------------------------------*/+/* 2. font families & sizes */+/* overspecified for cross-browser robustness */+body { font-family:helvetica,arial,sans-serif; }+pre { font-family:courier,"courier new",monospace; }+input.textinput, .dhx_combo_input, .dhx_combo_list { font-size:small; }+#editform textarea { font-family:courier,"courier new",monospace; font-size:small; }+.nav2 { font-size:small; }+#searchform { font-size:small; }+.topleftlink { font-size:small; }+.toprightlink { font-size:small; }+#journaldesc { font-size:small; }+.togglelink { font-size:smaller; white-space:nowrap }+.help { font-size:smaller; }+.form { font-size:small; }+.journalreport { font-size:small; }+.balancereport { font-size:small; }+.registerreport { font-size:small; }+.showall { font-size:small; }+/* #addformlink { font-size:small; } */+/* #editformlink { font-size:small; } */+#contenttitle { font-size:1.2em; }++/*------------------------------------------------------------------------------------------*/+/* 3. layout */++body { margin:0; }+#content { padding:1em 0 0 0.5em; }++#topbar { padding:2px; }+.topleftlink { float:left; margin-right:1em; padding:2px; }+.toprightlink { float:right; margin-left:1em; padding:2px; }+#topbar h1 { display:inline-block; vertical-align:top; margin:0; }+#journalinfo { vertical-align:middle; margin:0; }+/* #topbar { padding:4px; border-bottom:2px solid #ddd; } */++#message { margin:0.5em;}+.help { font-style: italic; }+.helprow td { padding-bottom:8px; }++#sidebar { float:left; padding-right:1em; margin-bottom:5em; }++#main { overflow:auto; border-left:thin solid #ded; padding-left:1em; }++#navlinks { margin-bottom:1em; }+.navlink { }+.navlinkcurrent { font-weight:bold; }+.form { margin:0em; }++#searchformdiv { margin:0 0 1em 0; white-space:nowrap; }+#searchform { margin:0; }+#searchform span { padding:4px; }+#stopfilterlink { font-weight:bold; }+.filtering { font-weight:bold; }++#main .journal { }+#main .register { }+.current { font-weight:bold; }+.date { padding-left:0em; }+.description { padding-left:1em; white-space:normal; }+.account { padding-left:1em; white-space:normal; }+.amount { padding-left:1em; white-space:nowrap; }+.balance { padding-left:1em; padding-right:0.3em; white-space:nowrap; }+.amount, .balance { width:2em; } /* minimise width */+.positive { }++table.journalreport { border-spacing: 0; }+.journalreport td { }+.journalreport pre { margin-top:0; }++.balancereport { border-spacing:0; }+.balancereport tr { vertical-align:bottom; border-spacing:0; }+.balancereport .title { white-space:nowrap; }+.balancereport .item { }+.balancereport .depth0 { padding-top:1em; }+.balancereport td { padding:0; }+.totalrule td { border-top:thin solid black; }+.balancereport .account { white-space:nowrap; }++.hidden { display:none; }+table.registerreport { border-spacing:0; }+table.registerreport tr { vertical-align:top; }+table.registerreport td { padding-bottom:0.2em; }+table.registerreport .date { white-space:nowrap; }+table.registerreport tr.posting { font-size:smaller; }+table.registerreport tr.posting .account { padding-left:1.5em; }+table.registerreport tr.posting .amount { padding-right:0.5em; }+tr.firstposting td { }+tr.newday td { border-top: 1px solid #797; }+/* tr.newday .date { font-weight:bold; } */+tr.newmonth td { border-top: 2px solid #464; }+/* tr.newyear td { border-top: 3px solid black; } */+#accountsheading { white-space:nowrap; }+++#addform input.textinput, #addform .dhx_combo_input, .dhx_combo_list { padding:4px; }+#addform table { }+#addform #addbuttonrow { text-align:right; }+/* #editform { width:95%; } */+#editform textarea { width:100%; padding:4px; }+#searchform table { border-spacing:0; padding-left:0em; }+++/*------------------------------------------------------------------------------------------*/+/* 4. dhtmlx.com auto-completing combo box styles */++.dhx_combo_input{+/* color:#333333; */+/* font-family: Arial; */+/* font-size: 9pt; */+/* border:0px; */+/* padding:2px 2px 2px 2px; */+/* position:absolute; */+/* top:0px; */+}++/* table {border:thin solid red} */+/* div {border:thin solid yellow} */++.dhx_combo_box{+ position:relative;+ display:inline-block;+ /* text-align:left; */+ /* height:20px; */+ /* _height:22px; */+ /* overflow:hidden; */+ /* background-color: white; */+}++.dhx_combo_list{+ position:absolute;+ z-index:230;+ overflow-y:auto;+ overflow-x:hidden;+ white-space:nowrap;+ border:1px solid black;+ height:50%;+ /* background-color: white; */+}++.dhx_combo_list div{+ cursor:default;+ padding:2px 2px 2px 2px;+}++.dhx_selected_option{+ background-color:navy;+ color:white;+}++.dhx_combo_img{+ /* display:none; */+ width:18px;+ height:20px;+ position:absolute;+ top:12px;+ right:-10px;+}++.dhx_combo_option_img{+ position:relative;+ top:1px;+ margin:0px;+ margin-left:2px;+ left:0px;+ width:18px; height:18px;+}++/* .combo_dhx_sel{ */+/* .dhx_selected_option{ */+/* background-image: url("../static/images/bg_selection.gif") !important; */+/* background-position: bottom; */+/* background-repeat: repeat-x; */+/* color:black; */+/* } */++++/* .dhx_combo_img_rtl{ */+/* position:absolute; */+/* top:0px; */+/* left:1px; */+/* width:17px; */+/* height:20px; */+/* } */+/* .dhx_combo_option_img_rtl{ */+/* float:right; */+/* margin-right :0px; */+/* width:18px; height:18px; */+/* } */++/* .dhx_combo_list_rtl{ */+/* direction: rtl; */+/* unicode-bidi : bidi-override; */+/* position:absolute; */+/* z-index:230; */+/* overflow-y:auto; */+/* overflow-x:hidden; */+/* border:1px solid black; */+/* height:100px; */+/* /\* font-family: Arial; *\/ */+/* font-size: 9pt; */+/* background-color: white; */+/* } */+/* .dhx_combo_list_rtl div{ */+/* direction: rtl; */+/* unicode-bidi : bidi-override; */+/* padding:2px 2px 2px 2px; */+/* } */+/* .dhx_combo_list_rtl div div{ */+/* float :right !important; */+/* cursor:default; */+/* } */+/* .dhx_combo_list_rtl div img{ */+/* float :right !important; */+/* } */+/* .dhx_combo_list_rtl div input{ */+/* float :right !important; */+/* } */++/* .dhx_combo_box.dhx_skyblue{ */+/* border:1px solid #a4bed4; */+/* } */+/* .dhx_combo_box.dhx_skyblue .dhx_combo_input { */+/* font-family:Tahoma; */+/* font-size: 11px; */+/* padding:3px; */+/* } */+/* .dhx_combo_list.dhx_skyblue_list{ */+/* background-color: #eaf2fb; */+/* border:1px solid #a4bed4; */+/* font-family:Tahoma; */+/* font-size: 11px; */+/* } */+/* .dhx_combo_list.dhx_skyblue_list div{ */+/* cursor:default; */+/* padding:3px 4px; */+/* } */+/* .dhx_combo_list_rtl.dhx_skyblue_list{ */+/* background-color: #eaf2fb; */+/* border:1px solid #a4bed4; */+/* font-family:Tahoma; */+/* font-size: 11px; */+/* } */+