Index: openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/AccordionContainer.js =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/Attic/AccordionContainer.js,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/AccordionContainer.js 7 Nov 2006 00:27:41 -0000 1.1 @@ -0,0 +1,279 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.AccordionContainer"); + +dojo.require("dojo.widget.*"); +dojo.require("dojo.html.*"); +dojo.require("dojo.lfx.html"); +dojo.require("dojo.html.selection"); +dojo.require("dojo.widget.html.layout"); +dojo.require("dojo.widget.PageContainer"); + + +/** + *summary + * Holds a set of panes where every pane's title is visible, but only one pane's content is visible at a time, + * and switching between panes is visualized by sliding the other panes up/down. + * + * description + * Front view (3 panes, pane #2 open) + * ------------------------ + * |:::Pane#1 title::: | + * |:::Pane#2 title::: | + * | | + * | pane#2 contents | + * | | + * |:::Pane#3 title::: | + * ------------------------ + * + * Side view (showing implementation): + * + * viewport pane#3 pane#2 pane#1 + * = + * | = + * | = | + * front | | | + * | | = + * | = + * | = + * = | + * | + * = + * + * Panes are stacked by z-index like a stack of cards, so they can be slid correctly. + * The panes on the bottom extend past the bottom of the viewport (but are hidden). + * + * usage + *
+ *
...
+ * ... + *
+ * + * TODO: + * * this widget should extend PageContainer + * * call child.onShow(), child.onHide() so you can attach to those methods if you want + */ + dojo.widget.defineWidget( + "dojo.widget.AccordionContainer", + dojo.widget.HtmlWidget, + { + isContainer: true, + + // String + // CSS class name for dom node w/the title + labelNodeClass: "label", + + // String + // CSS class name for dom node holding the content + containerNodeClass: "accBody", + + // Integer + // Amount of time (in ms) it takes to slide panes + duration: 250, + + fillInTemplate: function(){ + with(this.domNode.style){ + // position must be either relative or absolute + if(position!="absolute"){ + position="relative"; + } + overflow="hidden"; + } + }, + + addChild: function(/*Widget*/ widget){ + var child = this._addChild(widget); + this._setSizes(); + return child; // Widget + }, + + _addChild: function(/*Widget*/ widget){ + // summary + // Internal call to add child, used during postCreate() and by the real addChild() call + if(widget.open){ + dojo.deprecated("open parameter deprecated, use 'selected=true' instead will be removed in ", "0.5"); + dojo.debug(widget.widgetId + ": open == " + widget.open); + widget.selected=true; + } + if (widget.widgetType != "AccordionPane") { + var wrapper=dojo.widget.createWidget("AccordionPane",{label: widget.label, selected: widget.selected, labelNodeClass: this.labelNodeClass, containerNodeClass: this.containerNodeClass, allowCollapse: this.allowCollapse }); + wrapper.addChild(widget); + this.addWidgetAsDirectChild(wrapper); + this.registerChild(wrapper, this.children.length); + return wrapper; // Widget + } else { + dojo.html.addClass(widget.containerNode, this.containerNodeClass); + dojo.html.addClass(widget.labelNode, this.labelNodeClass); + this.addWidgetAsDirectChild(widget); + this.registerChild(widget, this.children.length); + return widget; // Widget + } + }, + + postCreate: function() { + var tmpChildren = this.children; + this.children=[]; + dojo.html.removeChildren(this.domNode); + dojo.lang.forEach(tmpChildren, dojo.lang.hitch(this,"_addChild")); + this._setSizes(); + }, + + removeChild: function(/*Widget*/ widget) { + dojo.widget.AccordionContainer.superclass.removeChild.call(this, widget); + this._setSizes(); + }, + + onResized: function(){ + this._setSizes(); + }, + + _setSizes: function() { + // summary + // Set panes' size/position based on my size, and the current open node. + + // get cumulative height of all the title bars, and figure out which pane is open + var totalCollapsedHeight = 0; + var openIdx = 0; + dojo.lang.forEach(this.children, function(child, idx){ + totalCollapsedHeight += child.getLabelHeight(); + if(child.selected){ openIdx=idx; } + }); + + // size and position each pane + var mySize=dojo.html.getContentBox(this.domNode); + var y = 0; + dojo.lang.forEach(this.children, function(child, idx){ + var childCollapsedHeight = child.getLabelHeight(); + child.resizeTo(mySize.width, mySize.height-totalCollapsedHeight+childCollapsedHeight); + child.domNode.style.zIndex=idx+1; + child.domNode.style.position="absolute"; + child.domNode.style.top = y+"px"; + y += (idx==openIdx) ? dojo.html.getBorderBox(child.domNode).height : childCollapsedHeight; + }); + }, + + selectChild: function(/*Widget*/ page){ + // summary + // close the current page and select a new one + dojo.lang.forEach(this.children, function(child){child.setSelected(child==page);}); + + // slide each pane that needs to be moved + var y = 0; + var anims = []; + dojo.lang.forEach(this.children, function(child, idx){ + if(child.domNode.style.top != (y+"px")){ + anims.push(dojo.lfx.html.slideTo(child.domNode, {top: y, left: 0}, this.duration)); + } + y += child.selected ? dojo.html.getBorderBox(child.domNode).height : child.getLabelHeight(); + }); + dojo.lfx.combine(anims).play(); + } + } +); + +/** + * summary + * AccordionPane is a box with a title that contains another widget (often a ContentPane). + * It's a widget used internally by AccordionContainer. + */ +dojo.widget.defineWidget( + "dojo.widget.AccordionPane", + dojo.widget.HtmlWidget, +{ + // parameters + + // String + // label to print on top of AccordionPane + label: "", + + // String + // CSS class name for the AccordionPane's dom node + "class": "dojoAccordionPane", + + // String + // CSS class name for the AccordionPane's label node + labelNodeClass: "label", + + // String + // CSS class name for the AccordionPane's container node + containerNodeClass: "accBody", + + // Boolean + // if true, this is the open pane + selected: false, + + templatePath: dojo.uri.dojoUri("src/widget/templates/AccordionPane.html"), + templateCssPath: dojo.uri.dojoUri("src/widget/templates/AccordionPane.css"), + + isContainer: true, + + fillInTemplate: function() { + dojo.html.addClass(this.domNode, this["class"]); + dojo.widget.AccordionPane.superclass.fillInTemplate.call(this); + dojo.html.disableSelection(this.labelNode); + this.setSelected(this.selected); + }, + + setLabel: function(/*String*/ label) { + // summary: set the title of the node + this.labelNode.innerHTML=label; + }, + + resizeTo: function(width, height){ + dojo.html.setMarginBox(this.domNode, {width: width, height: height}); + var children = [ + {domNode: this.labelNode, layoutAlign: "top"}, + {domNode: this.containerNode, layoutAlign: "client"} + ]; + dojo.widget.html.layout(this.domNode, children); + var childSize = dojo.html.getContentBox(this.containerNode); + this.children[0].resizeTo(childSize.width, childSize.height); + }, + + getLabelHeight: function() { + // summary: returns the height of the title dom node + return dojo.html.getMarginBox(this.labelNode).height; // Integer + }, + + onLabelClick: function() { + // summary: callback when someone clicks my label + this.parent.selectChild(this); + }, + + setSelected: function(/*Boolean*/ isSelected){ + this.selected=isSelected; + (isSelected ? dojo.html.addClass : dojo.html.removeClass)(this.domNode, this["class"]+"-selected"); + + // make sure child is showing (lazy load), and also that onShow()/onHide() is called + var child = this.children[0]; + if(child){ + if(isSelected){ + if(!child.isShowing()){ + child.show(); + }else{ + child.onShow(); + } + }else{ + child.onHide(); + } + } + } +}); + +// These arguments can be specified for the children of an AccordionContainer +// Since any widget can be specified as a child, mix them +// into the base widget class. (This is a hack, but it's effective.) +dojo.lang.extend(dojo.widget.Widget, { + // String + // is this the selected child? + // DEPRECATED: will be removed in 0.5. Used "selected" attribute instead. + open: false +}); Index: openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/AnimatedPng.js =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/Attic/AnimatedPng.js,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/AnimatedPng.js 7 Nov 2006 00:27:41 -0000 1.1 @@ -0,0 +1,98 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.AnimatedPng"); + +dojo.require("dojo.widget.*"); +dojo.require("dojo.widget.HtmlWidget"); + +// summary +// PNGs have great tranparency, but lack animation. +// This widget lets you point an img tag at an animated gif for graceful degrading, +// while letting you specify a png containing a grid of cells to animate between. +// +// usage +// +// +// var params = {src: "images/animatedpng_static.gif", aniSrc: "images/animatedpng_frames.gif", width: 20, height: 20, interval: 50}; +// var widget = dojo.widget.createWidget("AnimatedPng", params, document.getElementById("pngContainer")); +// +dojo.widget.defineWidget( + "dojo.widget.AnimatedPng", + dojo.widget.HtmlWidget, + { + isContainer: false, + + // Integer + // width (of each frame) in pixels + width: 0, + + // Integer + // height (of each frame) in pixels + height: 0, + + // String + // pathname to png file containing frames to be animated (ie, displayed sequentially) + aniSrc: '', + + // Integer + // time to display each frame + interval: 100, + + _blankSrc: dojo.uri.dojoUri("src/widget/templates/images/blank.gif"), + + templateString: '', + + postCreate: function(){ + this.cellWidth = this.width; + this.cellHeight = this.height; + + var img = new Image(); + var self = this; + + img.onload = function(){ self._initAni(img.width, img.height); }; + img.src = this.aniSrc; + }, + + _initAni: function(w, h){ + this.domNode.src = this._blankSrc; + this.domNode.width = this.cellWidth; + this.domNode.height = this.cellHeight; + this.domNode.style.backgroundImage = 'url('+this.aniSrc+')'; + this.domNode.style.backgroundRepeat = 'no-repeat'; + + this.aniCols = Math.floor(w/this.cellWidth); + this.aniRows = Math.floor(h/this.cellHeight); + this.aniCells = this.aniCols * this.aniRows; + this.aniFrame = 0; + + window.setInterval(dojo.lang.hitch(this, '_tick'), this.interval); + }, + + _tick: function(){ + this.aniFrame++; + if (this.aniFrame == this.aniCells) this.aniFrame = 0; + + var col = this.aniFrame % this.aniCols; + var row = Math.floor(this.aniFrame / this.aniCols); + + var bx = -1 * col * this.cellWidth; + var by = -1 * row * this.cellHeight; + + this.domNode.style.backgroundPosition = bx+'px '+by+'px'; + } + } +); Index: openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/Button.js =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/Attic/Button.js,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/Button.js 7 Nov 2006 00:27:41 -0000 1.1 @@ -0,0 +1,432 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.Button"); + +dojo.require("dojo.lang.extras"); +dojo.require("dojo.html.*"); +dojo.require("dojo.html.selection"); +dojo.require("dojo.widget.*"); + +/* + * summary + * Basically the same thing as a normal HTML button, but with special styling. + * usage + * + * + * var button1 = dojo.widget.createWidget("Button", {caption: "hello world", onClick: foo}); + * document.body.appendChild(button1.domNode); + */ +dojo.widget.defineWidget( + "dojo.widget.Button", + dojo.widget.HtmlWidget, + { + isContainer: true, + + // String + // text to display in button + caption: "", + + // Boolean + // if true, cannot click button + disabled: false, + + templatePath: dojo.uri.dojoUri("src/widget/templates/ButtonTemplate.html"), + templateCssPath: dojo.uri.dojoUri("src/widget/templates/ButtonTemplate.css"), + + // Url + // prefix of filename holding images (left, center, right) for button in normal state + inactiveImg: "src/widget/templates/images/soriaButton-", + + // Url + // prefix of filename holding images (left, center, right) for button when it's being hovered over + activeImg: "src/widget/templates/images/soriaActive-", + + // Url + // prefix of filename holding images (left, center, right) for button between mouse-down and mouse-up + pressedImg: "src/widget/templates/images/soriaPressed-", + + // Url + // prefix of filename holding images (left, center, right) for button when it's disabled (aka, grayed-out) + disabledImg: "src/widget/templates/images/soriaDisabled-", + + // Number + // shape of the button's end pieces; + // the height of the end pieces is a function of the button's height (which in turn is a function of the button's content), + // and then the width of the end pieces is relative to their height. + width2height: 1.0/3.0, + + fillInTemplate: function(){ + if(this.caption){ + this.containerNode.appendChild(document.createTextNode(this.caption)); + } + dojo.html.disableSelection(this.containerNode); + }, + + postCreate: function(){ + this._sizeMyself(); + }, + + _sizeMyself: function(){ + // we cannot size correctly if any of our ancestors are hidden (display:none), + // so temporarily attach to document.body + if(this.domNode.parentNode){ + var placeHolder = document.createElement("span"); + dojo.html.insertBefore(placeHolder, this.domNode); + } + dojo.body().appendChild(this.domNode); + + this._sizeMyselfHelper(); + + // Put this.domNode back where it was originally + if(placeHolder){ + dojo.html.insertBefore(this.domNode, placeHolder); + dojo.html.removeNode(placeHolder); + } + }, + + _sizeMyselfHelper: function(){ + var mb = dojo.html.getMarginBox(this.containerNode); + this.height = mb.height; + this.containerWidth = mb.width; + var endWidth= this.height * this.width2height; + + this.containerNode.style.left=endWidth+"px"; + + this.leftImage.height = this.rightImage.height = this.centerImage.height = this.height; + this.leftImage.width = this.rightImage.width = endWidth+1; + this.centerImage.width = this.containerWidth; + this.centerImage.style.left=endWidth+"px"; + this._setImage(this.disabled ? this.disabledImg : this.inactiveImg); + + if ( this.disabled ) { + dojo.html.prependClass(this.domNode, "dojoButtonDisabled"); + this.domNode.removeAttribute("tabIndex"); + dojo.widget.wai.setAttr(this.domNode, "waiState", "disabled", true); + } else { + dojo.html.removeClass(this.domNode, "dojoButtonDisabled"); + this.domNode.setAttribute("tabIndex", "0"); + dojo.widget.wai.setAttr(this.domNode, "waiState", "disabled", false); + } + + this.domNode.style.height=this.height + "px"; + this.domNode.style.width= (this.containerWidth+2*endWidth) + "px"; + }, + + onMouseOver: function(/*Event*/ e){ + // summary: callback when user mouses-over the button + if( this.disabled ){ return; } + dojo.html.prependClass(this.buttonNode, "dojoButtonHover"); + this._setImage(this.activeImg); + }, + + onMouseDown: function(/*Event*/ e){ + // summary: callback when user starts to click the button + if( this.disabled ){ return; } + dojo.html.prependClass(this.buttonNode, "dojoButtonDepressed"); + dojo.html.removeClass(this.buttonNode, "dojoButtonHover"); + this._setImage(this.pressedImg); + }, + + onMouseUp: function(/*Event*/ e){ + // summary: callback when the user finishes clicking + if( this.disabled ){ return; } + dojo.html.prependClass(this.buttonNode, "dojoButtonHover"); + dojo.html.removeClass(this.buttonNode, "dojoButtonDepressed"); + this._setImage(this.activeImg); + }, + + onMouseOut: function(/*Event*/ e){ + // summary: callback when the user moves the mouse off the button + if( this.disabled ){ return; } + if( e.toElement && dojo.html.isDescendantOf(e.toElement, this.buttonNode) ){ + return; // Ignore IE mouseOut events that dont actually leave button - Prevents hover image flicker in IE + } + dojo.html.removeClass(this.buttonNode, "dojoButtonHover"); + this._setImage(this.inactiveImg); + }, + + onKey: function(/*Event*/ e){ + // summary: callback when the user presses a key (on key-down) + if (!e.key) { return; } + var menu = dojo.widget.getWidgetById(this.menuId); + if (e.key == e.KEY_ENTER || e.key == " "){ + this.onMouseDown(e); + this.buttonClick(e); + dojo.lang.setTimeout(this, "onMouseUp", 75, e); + dojo.event.browser.stopEvent(e); + } + if(menu && menu.isShowingNow && e.key == e.KEY_DOWN_ARROW){ + // disconnect onBlur when focus moves into menu + dojo.event.disconnect(this.domNode, "onblur", this, "onBlur"); + // allow event to propagate to menu + } + }, + + onFocus: function(/*Event*/ e){ + // summary: callback on focus to the button + var menu = dojo.widget.getWidgetById(this.menuId); + if (menu){ + dojo.event.connectOnce(this.domNode, "onblur", this, "onBlur"); + } + }, + + onBlur: function(/*Event*/ e){ + // summary: callback when button loses focus + var menu = dojo.widget.getWidgetById(this.menuId); + if ( !menu ) { return; } + + if ( menu.close && menu.isShowingNow ){ + menu.close(); + } + }, + + buttonClick: function(/*Event*/ e){ + // summary: internal function for handling button clicks + if(!this.disabled){ + // focus may fail when tabIndex is not supported on div's + // by the browser, or when the node is disabled + try { this.domNode.focus(); } catch(e2) {}; + this.onClick(e); + } + }, + + onClick: function(/*Event*/ e) { + // summary: callback for when button is clicked; user can override this function + }, + + _setImage: function(/*String*/ prefix){ + this.leftImage.src=dojo.uri.dojoUri(prefix + "l.gif"); + this.centerImage.src=dojo.uri.dojoUri(prefix + "c.gif"); + this.rightImage.src=dojo.uri.dojoUri(prefix + "r.gif"); + }, + + _toggleMenu: function(/*String*/ menuId){ + var menu = dojo.widget.getWidgetById(menuId); + if ( !menu ) { return; } + if ( menu.open && !menu.isShowingNow) { + var pos = dojo.html.getAbsolutePosition(this.domNode, false); + menu.open(pos.x, pos.y+this.height, this); + } else if ( menu.close && menu.isShowingNow ){ + menu.close(); + } else { + menu.toggle(); + } + }, + + setCaption: function(/*String*/ content){ + // summary: reset the caption (text) of the button; takes an HTML string + this.caption=content; + this.containerNode.innerHTML=content; + this._sizeMyself(); + }, + + setDisabled: function(/*Boolean*/ disabled){ + // summary: set disabled state of button + this.disabled=disabled; + this._sizeMyself(); + } + }); + +/* + * summary + * push the button and a menu shows up + * usage + * + * + * var button1 = dojo.widget.createWidget("DropDownButton", {caption: "hello world", menuId: foo}); + * document.body.appendChild(button1.domNode); + */ +dojo.widget.defineWidget( + "dojo.widget.DropDownButton", + dojo.widget.Button, + { + // String + // widget id of the menu that this button should activate + menuId: "", + + // Url + // path of arrow image to display to the right of the button text + downArrow: "src/widget/templates/images/whiteDownArrow.gif", + + // Url + // path of arrow image to display to the right of the button text, when the button is disabled + disabledDownArrow: "src/widget/templates/images/whiteDownArrow.gif", + + fillInTemplate: function(){ + dojo.widget.DropDownButton.superclass.fillInTemplate.apply(this, arguments); + + this.arrow = document.createElement("img"); + dojo.html.setClass(this.arrow, "downArrow"); + + dojo.widget.wai.setAttr(this.domNode, "waiState", "haspopup", this.menuId); + }, + + _sizeMyselfHelper: function(){ + // draw the arrow (todo: why is the arror in containerNode rather than outside it?) + this.arrow.src = dojo.uri.dojoUri(this.disabled ? this.disabledDownArrow : this.downArrow); + this.containerNode.appendChild(this.arrow); + + dojo.widget.DropDownButton.superclass._sizeMyselfHelper.call(this); + }, + + onClick: function(/*Event*/ e){ + // summary: callback when button is clicked; user shouldn't override this function or else the menu won't toggle + this._toggleMenu(this.menuId); + } + }); + +/* + * summary + * left side is normal button, right side displays menu + * usage + * + * + * var button1 = dojo.widget.createWidget("DropDownButton", {caption: "hello world", onClick: foo, menuId: "myMenu"}); + * document.body.appendChild(button1.domNode); + */ +dojo.widget.defineWidget( + "dojo.widget.ComboButton", + dojo.widget.Button, + { + // String + // widget id of the menu that this button should activate + menuId: "", + + templatePath: dojo.uri.dojoUri("src/widget/templates/ComboButtonTemplate.html"), + + // Integer + // # of pixels between left & right part of button + splitWidth: 2, + + // Integer + // width of segment holding down arrow + arrowWidth: 5, + + _sizeMyselfHelper: function(/*Event*/ e){ + var mb = dojo.html.getMarginBox(this.containerNode); + this.height = mb.height; + this.containerWidth = mb.width; + + var endWidth= this.height/3; + + if(this.disabled){ + dojo.widget.wai.setAttr(this.domNode, "waiState", "disabled", true); + this.domNode.removeAttribute("tabIndex"); + } + else { + dojo.widget.wai.setAttr(this.domNode, "waiState", "disabled", false); + this.domNode.setAttribute("tabIndex", "0"); + } + + // left part + this.leftImage.height = this.rightImage.height = this.centerImage.height = + this.arrowBackgroundImage.height = this.height; + this.leftImage.width = endWidth+1; + this.centerImage.width = this.containerWidth; + this.buttonNode.style.height = this.height + "px"; + this.buttonNode.style.width = endWidth + this.containerWidth + "px"; + this._setImage(this.disabled ? this.disabledImg : this.inactiveImg); + + // right part + this.arrowBackgroundImage.width=this.arrowWidth; + this.rightImage.width = endWidth+1; + this.rightPart.style.height = this.height + "px"; + this.rightPart.style.width = this.arrowWidth + endWidth + "px"; + this._setImageR(this.disabled ? this.disabledImg : this.inactiveImg); + + // outer container + this.domNode.style.height=this.height + "px"; + var totalWidth = this.containerWidth+this.splitWidth+this.arrowWidth+2*endWidth; + this.domNode.style.width= totalWidth + "px"; + }, + + _setImage: function(prefix){ + this.leftImage.src=dojo.uri.dojoUri(prefix + "l.gif"); + this.centerImage.src=dojo.uri.dojoUri(prefix + "c.gif"); + }, + + /*** functions on right part of button ***/ + rightOver: function(/*Event*/ e){ + // summary: + // callback when mouse-over right part of button; + // onMouseOver() is the callback for the left side of the button. + if( this.disabled ){ return; } + dojo.html.prependClass(this.rightPart, "dojoButtonHover"); + this._setImageR(this.activeImg); + }, + + rightDown: function(/*Event*/ e){ + // summary: + // callback when mouse-down right part of button; + // onMouseDown() is the callback for the left side of the button. + if( this.disabled ){ return; } + dojo.html.prependClass(this.rightPart, "dojoButtonDepressed"); + dojo.html.removeClass(this.rightPart, "dojoButtonHover"); + this._setImageR(this.pressedImg); + }, + + rightUp: function(/*Event*/ e){ + // summary: + // callback when mouse-up right part of button; + // onMouseUp() is the callback for the left side of the button. + if( this.disabled ){ return; } + dojo.html.prependClass(this.rightPart, "dojoButtonHover"); + dojo.html.removeClass(this.rightPart, "dojoButtonDepressed"); + this._setImageR(this.activeImg); + }, + + rightOut: function(/*Event*/ e){ + // summary: + // callback when moving the mouse off of the right part of button; + // onMouseOut() is the callback for the left side of the button. + if( this.disabled ){ return; } + dojo.html.removeClass(this.rightPart, "dojoButtonHover"); + this._setImageR(this.inactiveImg); + }, + + rightClick: function(/*Event*/ e){ + // summary: + // callback when clicking the right part of button; + // onClick() is the callback for the left side of the button. + if( this.disabled ){ return; } + // focus may fail when tabIndex is not supported on div's + // by the browser, or when the node is disabled + try { this.domNode.focus(); } catch(e2) {}; + this._toggleMenu(this.menuId); + }, + + _setImageR: function(prefix){ + this.arrowBackgroundImage.src=dojo.uri.dojoUri(prefix + "c.gif"); + this.rightImage.src=dojo.uri.dojoUri(prefix + "r.gif"); + }, + + /*** keyboard functions ***/ + + onKey: function(/*Event*/ e){ + if (!e.key) { return; } + var menu = dojo.widget.getWidgetById(this.menuId); + if(e.key== e.KEY_ENTER || e.key == " "){ + this.onMouseDown(e); + this.buttonClick(e); + dojo.lang.setTimeout(this, "onMouseUp", 75, e); + dojo.event.browser.stopEvent(e); + } else if (e.key == e.KEY_DOWN_ARROW && e.altKey){ + this.rightDown(e); + this.rightClick(e); + dojo.lang.setTimeout(this, "rightUp", 75, e); + dojo.event.browser.stopEvent(e); + } else if(menu && menu.isShowingNow && e.key == e.KEY_DOWN_ARROW){ + // disconnect onBlur when focus moves into menu + dojo.event.disconnect(this.domNode, "onblur", this, "onBlur"); + // allow event to propagate to menu + } + } + }); Index: openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/Chart.js =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/Attic/Chart.js,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/ajaxhelper/www/resources/dojo-ajax/src/widget/Chart.js 7 Nov 2006 00:27:41 -0000 1.1 @@ -0,0 +1,257 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.Chart"); + +dojo.require("dojo.widget.*"); +dojo.require("dojo.gfx.color"); +dojo.require("dojo.gfx.color.hsl"); + +// Base class for svg and vml implementations of Chart +dojo.declare( + "dojo.widget.Chart", + null, + function(){ + this.series = []; + }, +{ + isContainer: false, + + assignColors: function(){ + // summary + // Assigns/generates a color for a data series. + var hue=30; + var sat=120; + var lum=120; + var steps = Math.round(330/this.series.length); + + for(var i=0; i<..> + + // assume column 0 == X + for (var i=1; i=range.start; i--){ + var n = parseFloat(this.values[i].value); + if(!isNaN(n)){ t += n; c++; } + } + t /= Math.max(c,1); + return t; + }, + + getMovingAverage: function(len){ + var range = this.createRange(len); + if(range.index<0){ return 0; } + var t = 0; + var c = 0; + for(var i=range.index; i>=range.start; i--){ + var n = parseFloat(this.values[i].value); + if(!isNaN(n)){ t += n; c++; } + } + t /= Math.max(c,1); + return t; + }, + + getVariance: function(len){ + var range = this.createRange(len); + if(range.index < 0){ return 0; } + var t = 0; // FIXME: for tom: wtf are t, c, and s? + var s = 0; + var c = 0; + for(var i=range.index; i>=range.start; i--){ + var n = parseFloat(this.values[i].value); + if(!isNaN(n)){ + t += n; + s += Math.pow(n,2); + c++; + } + } + return (s/c)-Math.pow(t/c,2); + }, + + getStandardDeviation: function(len){ + return Math.sqrt(this.getVariance(len)); + }, + + getMax: function(len){ + var range = this.createRange(len); + if(range.index < 0){ return 0; } + var t = 0; + for (var i=range.index; i>=range.start; i--){ + var n=parseFloat(this.values[i].value); + if (!isNaN(n)){ + t=Math.max(n,t); + } + } + return t; + }, + + getMin: function(len){ + var range=this.createRange(len); + if(range.index < 0){ return 0; } + var t = 0; + for(var i=range.index; i>=range.start; i--){ + var n = parseFloat(this.values[i].value); + if(!isNaN(n)){ + t=Math.min(n,t); + } + } + return t; + }, + + getMedian: function(len){ + var range = this.createRange(len); + + if(range.index<0){ return 0; } + + var a = []; + for (var i=range.index; i>=range.start; i--){ + var n=parseFloat(this.values[i].value); + if (!isNaN(n)){ + var b=false; + for(var j=0; j0){ return a[Math.ceil(a.length/2)]; } + return 0; + }, + + getMode: function(len){ + var range=this.createRange(len); + if(range.index<0){ return 0; } + var o = {}; + var ret = 0 + var m = 0; + for(var i=range.index; i>=range.start; i--){ + var n=parseFloat(this.values[i].value); + if(!isNaN(n)){ + if (!o[this.values[i].value]) o[this.values[i].value] = 1; + else o[this.values[i].value]++; + } + } + for(var p in o){ + if(mlabel text rather than + // + var notcon = true; + this.id = this.id !="" ? this.id : this.widgetId; + if(this.id != ""){ + var labels = document.getElementsByTagName("label"); + if (labels != null && labels.length > 0){ + for(var i=0; i